// EncodeYUVA encodes and writes YUVA Image data into the writer as WebP. func EncodeYUVA(w io.Writer, img *YUVAImage, c Config) (err error) { webpConfig, err := initConfig(c) if err != nil { return } var pic C.WebPPicture if C.WebPPictureInit(&pic) == 0 { return errors.New("Could not initialize webp picture") } pic.use_argb = 0 pic.colorspace = C.WebPEncCSP(img.ColorSpace) pic.width = C.int(img.Rect.Dx()) pic.height = C.int(img.Rect.Dy()) pic.y = (*C.uint8_t)(&img.Y[0]) pic.u = (*C.uint8_t)(&img.Cb[0]) pic.v = (*C.uint8_t)(&img.Cr[0]) pic.y_stride = C.int(img.YStride) pic.uv_stride = C.int(img.CStride) if img.ColorSpace == YUV420A { pic.a = (*C.uint8_t)(&img.A[0]) pic.a_stride = C.int(img.AStride) } pic.writer = C.WebPWriterFunction(C.writeWebP) pic.custom_ptr = unsafe.Pointer(&destinationManager{writer: w}) if C.WebPEncode(webpConfig, &pic) == 0 { return fmt.Errorf("Encoding error: %d", pic.error_code) } return }
// EncodeRGBA encodes and writes image.Image into the writer as WebP. // Now supports image.RGBA or image.NRGBA. func EncodeRGBA(w io.Writer, img image.Image, c Config) (err error) { webpConfig, err := initConfig(c) if err != nil { return } var pic C.WebPPicture if C.WebPPictureInit(&pic) == 0 { return errors.New("Could not initialize webp picture") } pic.use_argb = 1 pic.width = C.int(img.Bounds().Dx()) pic.height = C.int(img.Bounds().Dy()) pic.writer = C.WebPWriterFunction(C.writeWebP) pic.custom_ptr = unsafe.Pointer(&destinationManager{writer: w}) switch p := img.(type) { case *image.RGBA: C.WebPPictureImportRGBA(&pic, (*C.uint8_t)(&p.Pix[0]), C.int(p.Stride)) case *image.NRGBA: C.WebPPictureImportRGBA(&pic, (*C.uint8_t)(&p.Pix[0]), C.int(p.Stride)) default: return errors.New("unsupported image type") } defer C.WebPPictureFree(&pic) if C.WebPEncode(webpConfig, &pic) == 0 { return fmt.Errorf("Encoding error: %d", pic.error_code) } return }