def from_buffer(buf): ptr = ffi.new('WebPData*') lib.WebPDataInit(ptr) data_ref = ffi.from_buffer(buf) ptr.size = len(buf) ptr.bytes = ffi.cast('uint8_t*', data_ref) return WebPData(ptr, data_ref)
def decode(self, color_mode=WebPColorMode.RGBA): dec_config = WebPDecoderConfig.new() dec_config.read_features(self) if color_mode == WebPColorMode.RGBA \ or color_mode == WebPColorMode.bgrA \ or color_mode == WebPColorMode.BGRA \ or color_mode == WebPColorMode.rgbA \ or color_mode == WebPColorMode.ARGB \ or color_mode == WebPColorMode.Argb: bytes_per_pixel = 4 elif color_mode == WebPColorMode.RGB \ or color_mode == WebPColorMode.BGR: bytes_per_pixel = 3 elif color_mode == WebPColorMode.RGB_565 \ or color_mode == WebPColorMode.RGBA_4444 \ or color_mode == WebPColorMode.rgbA_4444: bytes_per_pixel = 2 else: raise WebPError('unsupported color mode: {}'.format(str(color_mode))) arr = np.empty((dec_config.input.height, dec_config.input.width, bytes_per_pixel), dtype=np.uint8) dec_config.output.colorspace = color_mode.value dec_config.output.u.RGBA.rgba = ffi.cast('uint8_t*', ffi.from_buffer(arr)) dec_config.output.u.RGBA.size = arr.size dec_config.output.u.RGBA.stride = dec_config.input.width * bytes_per_pixel dec_config.output.is_external_memory = 1 if lib.WebPDecode(self.ptr.bytes, self.size, dec_config.ptr) != lib.VP8_STATUS_OK: raise WebPError('failed to decode') lib.WebPFreeDecBuffer(ffi.addressof(dec_config.ptr, 'output')) return arr
def from_numpy(arr, **_3to2kwargs): if 'pilmode' in _3to2kwargs: pilmode = _3to2kwargs['pilmode']; del _3to2kwargs['pilmode'] else: pilmode = None ptr = ffi.new('WebPPicture*') if lib.WebPPictureInit(ptr) == 0: raise WebPError('version mismatch') ptr.height, ptr.width, bytes_per_pixel = arr.shape if pilmode is None: if bytes_per_pixel == 3: import_func = lib.WebPPictureImportRGB elif bytes_per_pixel == 4: import_func = lib.WebPPictureImportRGBA else: raise WebPError('cannot infer color mode from array of shape ' + repr(arr.shape)) else: if pilmode == 'RGB': import_func = lib.WebPPictureImportRGB elif pilmode == 'RGBA': import_func = lib.WebPPictureImportRGBA else: raise WebPError('unsupported image mode: ' + pilmode) pixels = ffi.cast('uint8_t*', ffi.from_buffer(arr)) stride = ptr.width * bytes_per_pixel ptr.use_argb = 1 if import_func(ptr, pixels, stride) == 0: raise WebPError('memory error') return WebPPicture(ptr)
def from_pil(img): ptr = ffi.new('WebPPicture*') if lib.WebPPictureInit(ptr) == 0: raise WebPError('version mismatch') ptr.width = img.width ptr.height = img.height if img.mode == 'RGB': import_func = lib.WebPPictureImportRGB bytes_per_pixel = 3 elif img.mode == 'RGBA': import_func = lib.WebPPictureImportRGBA bytes_per_pixel = 4 else: raise WebPError('unsupported image mode: ' + img.mode) arr = np.asarray(img, dtype=np.uint8) pixels = ffi.cast('uint8_t*', ffi.from_buffer(arr)) stride = img.width * bytes_per_pixel ptr.use_argb = 1 if import_func(ptr, pixels, stride) == 0: raise WebPError('memory error') return WebPPicture(ptr)
def from_numpy(arr, *, pilmode=None): ptr = ffi.new('WebPPicture*') if lib.WebPPictureInit(ptr) == 0: raise WebPError('version mismatch') if len(arr.shape) == 3: bytes_per_pixel = arr.shape[-1] elif len(arr.shape) == 2: bytes_per_pixel = 1 else: raise WebPError('unexpected array shape: ' + repr(arr.shape)) if pilmode is None: if bytes_per_pixel == 3: import_func = lib.WebPPictureImportRGB elif bytes_per_pixel == 4: import_func = lib.WebPPictureImportRGBA else: raise WebPError( 'cannot infer color mode from array of shape ' + repr(arr.shape)) else: if pilmode == 'RGB': import_func = lib.WebPPictureImportRGB elif pilmode == 'RGBA': import_func = lib.WebPPictureImportRGBA else: raise WebPError('unsupported image mode: ' + pilmode) ptr.height, ptr.width = arr.shape[:2] pixels = ffi.cast('uint8_t*', ffi.from_buffer(arr)) stride = ptr.width * bytes_per_pixel ptr.use_argb = 1 if import_func(ptr, pixels, stride) == 0: raise WebPError('memory error') return WebPPicture(ptr)