Beispiel #1
0
 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)
Beispiel #2
0
    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
Beispiel #3
0
    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)
Beispiel #4
0
    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)
Beispiel #5
0
    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)