You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
talgo-libwebp/webp/yuva_image.go

63 lines
1.6 KiB

package webp
import "image"
// YUVAImage represents a image of YUV colors with alpha channel image.
//
// YUVAImage contains decoded YCbCr image data with alpha channel,
// but it is not compatible with image.YCbCr. Because, the RGB-YCbCr conversion
// that used in WebP is following to ITU-R BT.601 standard.
// In contrast, the conversion of Image.YCbCr (and color.YCbCrModel) is following
// to the JPEG standard (JFIF). If you need the image as image.YCBCr, you will
// first convert from WebP to RGB image, then convert from RGB image to JPEG's
// YCbCr image.
//
// See: http://en.wikipedia.org/wiki/YCbCr
//
type YUVAImage struct {
Y, Cb, Cr, A []uint8
YStride int
CStride int
AStride int
ColorSpace ColorSpace
Rect image.Rectangle
}
// NewYUVAImage creates and allocates image buffer.
func NewYUVAImage(r image.Rectangle, c ColorSpace) (image *YUVAImage) {
yw, yh := r.Dx(), r.Dx()
cw, ch := ((r.Max.X+1)/2 - r.Min.X/2), ((r.Max.Y+1)/2 - r.Min.Y/2)
switch c {
case YUV420:
b := make([]byte, yw*yh+2*cw*ch)
image = &YUVAImage{
Y: b[:yw*yh],
Cb: b[yw*yh+0*cw*ch : yw*yh+1*cw*ch],
Cr: b[yw*yh+1*cw*ch : yw*yh+2*cw*ch],
A: nil,
YStride: yw,
CStride: cw,
AStride: 0,
ColorSpace: c,
Rect: r,
}
case YUV420A:
b := make([]byte, 2*yw*yh+2*cw*ch)
image = &YUVAImage{
Y: b[:yw*yh],
Cb: b[yw*yh+0*cw*ch : yw*yh+1*cw*ch],
Cr: b[yw*yh+1*cw*ch : yw*yh+2*cw*ch],
A: b[yw*yh+2*cw*ch:],
YStride: yw,
CStride: cw,
AStride: yw,
ColorSpace: c,
Rect: r,
}
}
return
}