h2non / imaginary

Fast, simple, scalable, Docker-ready HTTP microservice for high-level image processing
https://fly.io/docs/app-guides/run-a-global-image-service/
MIT License
5.43k stars 454 forks source link

Bad PNG compression #237

Open lastonoga opened 5 years ago

lastonoga commented 5 years ago

All pngs that i try to compress always have bigger size than original. If the image was compressed after processing the size can be bigger in 4 times. So it's unavailable to use in production even with compression level = 9.

Is there anyways to improve PNG compression?

lastonoga commented 5 years ago

I use fit/resize/convert commands with URL file source in official docker image

Dynom commented 5 years ago

Original test-photo used by Vivek Sharma -- https://unsplash.com/photos/lYZRq-3QoRA

There is clearly something off with PNG compression:

Imaginary Size Size libvips
test-500x325-imaginary-compression_1.png 384 344 test-500x325-vipsthumbnail-compression_1.png
test-500x325-imaginary-compression_2.png 384 340 test-500x325-vipsthumbnail-compression_2.png
test-500x325-imaginary-compression_3.png 384 332 test-500x325-vipsthumbnail-compression_3.png
test-500x325-imaginary-compression_4.png 384 316 test-500x325-vipsthumbnail-compression_4.png
test-500x325-imaginary-compression_5.png 384 312 test-500x325-vipsthumbnail-compression_5.png
test-500x325-imaginary-compression_6.png 384 308 test-500x325-vipsthumbnail-compression_6.png
test-500x325-imaginary-compression_7.png 384 308 test-500x325-vipsthumbnail-compression_7.png
test-500x325-imaginary-compression_8.png 384 304 test-500x325-vipsthumbnail-compression_8.png
test-500x325-imaginary-compression_9.png 384 320 test-500x325-vipsthumbnail-compression_9.png

libvips commandline:

for compression in $(seq 1 9);
do
  vips VipsForeignSavePngFile test-500x325-vipsthumbnail.png test-500x325-vipsthumbnail-compression_${compression}.png --compression ${compression};
done

Imaginary commandline:

for compression in $(seq 1 9);
do
  curl -sv "http://localhost:9000/resize?width=500&nocrop=true&type=png&url=https%3A%2F%2Fimages.unsplash.com%2Fphoto-1548084131-6c908b410378%3Fixlib%3Drb-1.2.1%26q%3D85%26fm%3Djpg%26crop%3Dentropy%26cs%3Dsrgb%26dl%3Dvivek-sharma-1313298-unsplash.jpg&compression=${compression}" > test-500x325-imaginary-compression_${compression}.png;
done

Fileinfo

test-500x325-imaginary-compression_1.png:     PNG image data, 500 x 325, 8-bit/color RGB, non-interlaced
test-500x325-imaginary-compression_2.png:     PNG image data, 500 x 325, 8-bit/color RGB, non-interlaced
test-500x325-imaginary-compression_3.png:     PNG image data, 500 x 325, 8-bit/color RGB, non-interlaced
test-500x325-imaginary-compression_4.png:     PNG image data, 500 x 325, 8-bit/color RGB, non-interlaced
test-500x325-imaginary-compression_5.png:     PNG image data, 500 x 325, 8-bit/color RGB, non-interlaced
test-500x325-imaginary-compression_6.png:     PNG image data, 500 x 325, 8-bit/color RGB, non-interlaced
test-500x325-imaginary-compression_7.png:     PNG image data, 500 x 325, 8-bit/color RGB, non-interlaced
test-500x325-imaginary-compression_8.png:     PNG image data, 500 x 325, 8-bit/color RGB, non-interlaced
test-500x325-imaginary-compression_9.png:     PNG image data, 500 x 325, 8-bit/color RGB, non-interlaced
test-500x325-vipsthumbnail-compression_1.png: PNG image data, 500 x 325, 8-bit/color RGBA, non-interlaced
test-500x325-vipsthumbnail-compression_2.png: PNG image data, 500 x 325, 8-bit/color RGBA, non-interlaced
test-500x325-vipsthumbnail-compression_3.png: PNG image data, 500 x 325, 8-bit/color RGBA, non-interlaced
test-500x325-vipsthumbnail-compression_4.png: PNG image data, 500 x 325, 8-bit/color RGBA, non-interlaced
test-500x325-vipsthumbnail-compression_5.png: PNG image data, 500 x 325, 8-bit/color RGBA, non-interlaced
test-500x325-vipsthumbnail-compression_6.png: PNG image data, 500 x 325, 8-bit/color RGBA, non-interlaced
test-500x325-vipsthumbnail-compression_7.png: PNG image data, 500 x 325, 8-bit/color RGBA, non-interlaced
test-500x325-vipsthumbnail-compression_8.png: PNG image data, 500 x 325, 8-bit/color RGBA, non-interlaced
test-500x325-vipsthumbnail-compression_9.png: PNG image data, 500 x 325, 8-bit/color RGBA, non-interlaced

I'm running on libvips 8.7.2-Wed Dec 5 17:37:43 UTC 2018 And I've followed it back to the bridge:

vips_pngsave_bridge(VipsImage *in, void **buf, size_t *len, int strip, int compression, int quality, int interlace) {
    return vips_pngsave_buffer(in, buf, len,
        "strip", INT_TO_GBOOLEAN(strip),
        "compression", compression,
        "interlace", INT_TO_GBOOLEAN(interlace),
        "filter", VIPS_FOREIGN_PNG_FILTER_NONE,
        NULL
    );

And the documentation of vips_pngsave_buffer() is pretty clear on the topic. So I don't understand at this point where things go wrong.

Dynom commented 5 years ago

Possibly related to #240