remove no-alpha webp support

We used to try to spot webp images with no alpha and load them as plain
RGB, but it turns out this is difficult to do reliably, especially
for animated images.

This patch simply removes support, so all webp images now load as RGBA.

See https://github.com/libvips/libvips/issues/1351
This commit is contained in:
John Cupitt 2019-06-27 16:37:11 +01:00
parent ea2367e24c
commit d1094847a3
3 changed files with 17 additions and 20 deletions

View File

@ -1,5 +1,6 @@
20/6/19 started 8.9.0
- add vips_image_get/set_array_int()
- remove support for no-alpha webp images, it didn't work well
24/5/19 started 8.8.1
- improve realpath() use on older libc

View File

@ -20,6 +20,9 @@
* 30/4/19
* - deprecate shrink, use scale instead, and make it a double ... this
* lets us do faster and more accurate thumbnailing
* 27/6/19
* - remove non-alpha output: it's very hard to decide if a webp image
* really has zero transparency
*/
/*
@ -107,10 +110,6 @@ typedef struct {
int frame_width;
int frame_height;
/* TRUE for RGBA.
*/
int alpha;
/* Number of frames in file.
*/
int frame_count;
@ -446,11 +445,10 @@ read_header( Read *read, VipsImage *out )
flags = WebPDemuxGetI( read->demux, WEBP_FF_FORMAT_FLAGS );
read->alpha = flags & ALPHA_FLAG;
if( read->alpha )
read->config.output.colorspace = MODE_RGBA;
else
read->config.output.colorspace = MODE_RGB;
/* The alpha flag says if this square of pixels in this frame has an
* alpha, not if our output image should have an alpha.
*/
read->config.output.colorspace = MODE_RGBA;
if( flags & ANIMATION_FLAG ) {
int loop_count;
@ -534,8 +532,7 @@ read_header( Read *read, VipsImage *out )
read->frame = vips_image_new_memory();
vips_image_init_fields( read->frame,
read->frame_width, read->frame_height,
read->alpha ? 4 : 3,
read->frame_width, read->frame_height, 4,
VIPS_FORMAT_UCHAR, VIPS_CODING_NONE,
VIPS_INTERPRETATION_sRGB,
1.0, 1.0 );
@ -545,8 +542,7 @@ read_header( Read *read, VipsImage *out )
return( -1 );
vips_image_init_fields( out,
read->width, read->height,
read->alpha ? 4 : 3,
read->width, read->height, 4,
VIPS_FORMAT_UCHAR, VIPS_CODING_NONE,
VIPS_INTERPRETATION_sRGB,
1.0, 1.0 );
@ -598,8 +594,7 @@ read_frame( Read *read,
frame = vips_image_new_memory();
vips_image_init_fields( frame,
width, height,
read->alpha ? 4 : 3,
width, height, 4,
VIPS_FORMAT_UCHAR, VIPS_CODING_NONE,
VIPS_INTERPRETATION_sRGB,
1.0, 1.0 );

View File

@ -23,6 +23,7 @@ class TestForeign:
cls.tempdir = tempfile.mkdtemp()
cls.colour = pyvips.Image.jpegload(JPEG_FILE)
cls.rgba = cls.colour.bandjoin(255)
cls.mono = cls.colour.extract_band(1)
# we remove the ICC profile: the RGB one will no longer be appropriate
cls.mono.remove("icc-profile-data")
@ -463,22 +464,22 @@ class TestForeign:
def test_webp(self):
def webp_valid(im):
a = im(10, 10)
assert_almost_equal_objects(a, [71, 166, 236])
assert_almost_equal_objects(a, [70, 165, 235, 255])
assert im.width == 550
assert im.height == 368
assert im.bands == 3
assert im.bands == 4
self.file_loader("webpload", WEBP_FILE, webp_valid)
self.buffer_loader("webpload_buffer", WEBP_FILE, webp_valid)
self.save_load_buffer("webpsave_buffer", "webpload_buffer",
self.colour, 60)
self.save_load("%s.webp", self.colour)
self.rgba, 60)
self.save_load("%s.webp", self.rgba)
# test lossless mode
im = pyvips.Image.new_from_file(WEBP_FILE)
buf = im.webpsave_buffer(lossless=True)
im2 = pyvips.Image.new_from_buffer(buf, "")
assert im.avg() == im2.avg()
assert abs(im.avg() - im2.avg()) < 1
# higher Q should mean a bigger buffer
b1 = im.webpsave_buffer(Q=10)