saucecontrol / PhotoSauce

MagicScaler high-performance, high-quality image processing pipeline for .NET
http://photosauce.net/
MIT License
569 stars 49 forks source link

libpng fails to convert several files that WIC can handle #140

Closed svenclaesson closed 8 months ago

svenclaesson commented 8 months ago

I've attached a test project with various png images found here here MagicScalerPngTest.zip

When running this using WIC Successfully converted 191/254

When running with libpng

CodecManager.Configure(codecs =>
{
    codecs.UseLibpng();
});

bad adaptive filter value is likely the same as https://github.com/saucecontrol/PhotoSauce/issues/139 but the others might be interesting to look into.

008b8bb75b8a487dc5aac86c9abb06fb.png Object reference not set to an instance of an object. 073c98872b81d1004d750f18a4b5f732.png Object reference not set to an instance of an object. 0b7d50ac449fd59eb3de00647636d0c9.png Object reference not set to an instance of an object. 138331052d7c6e4acebfaa92af314e12.png Object reference not set to an instance of an object. 13f665c09e4b03cdbe2fff3015ec8aa7.png Object reference not set to an instance of an object. 18288f761922f9b9b00e927eaeb9e707.png Libpng decoder failed. bad adaptive filter value 18bd8bf75e7a9b40b961dd501654ce0e.png Object reference not set to an instance of an object. 1ae14e57b7062597279134ff2eeb39c0.png Object reference not set to an instance of an object. 31e3bc3eb811cff582b5feee2494fed8.png Object reference not set to an instance of an object. 429104334d1fb6a58e17307883c17608.png Object reference not set to an instance of an object. 42ec8668adb5dbc6581393f463976510.png Object reference not set to an instance of an object. 4389427591c18bf36e748172640862c3.png Object reference not set to an instance of an object. 4f14b7aab3a41855378c5517342598b9.png Object reference not set to an instance of an object. 579294d4d8110fc64980dd72a5066780.png Object reference not set to an instance of an object. 586914b5d01d3889fb7bb5c44fe29771.png Libpng decoder failed. bad adaptive filter value 5beaadc10dfdbf61124e98fdf8a5c191.png Object reference not set to an instance of an object. 6399623892b45aa4901aa6e702c7a62d.png Object reference not set to an instance of an object. 8711007ea5e351755a80cba913d16a32.png Object reference not set to an instance of an object. 9032e447e32e09aef5b7de2fab42494d.png Object reference not set to an instance of an object. 94e1bdbb03c42581d8407602634636ea.png Object reference not set to an instance of an object. 9a3e0c7b687b526987e2270541002d47.png Libpng decoder failed. bad adaptive filter value 9bd8a9ed81c5a9190f74496197da7249.png Object reference not set to an instance of an object. a1d54c960686558901e320a52a967158.png Object reference not set to an instance of an object. b3ac9fdb7239f42c734921dfe790291b.png Object reference not set to an instance of an object. bd927c8547634cdbdd22af0afe818a9b.png Libpng decoder failed. bad adaptive filter value c-586914b5d01d3889fb7bb5c44fe29771.png Libpng decoder failed. bad adaptive filter value c-9032e447e32e09aef5b7de2fab42494d.png Object reference not set to an instance of an object. c-94e1bdbb03c42581d8407602634636ea.png Object reference not set to an instance of an object. c-9a3e0c7b687b526987e2270541002d47.png Libpng decoder failed. bad adaptive filter value c-c53911b0385c34a8204c30fdc14ea5cc.png Object reference not set to an instance of an object. c-d3ffec5786387c590721e674d705f16e.png Libpng decoder failed. bad adaptive filter value c-e585afb2ecf50c04eaf0dedb71602cb8.png Specified argument was out of the range of valid values. (Parameter 'length') c-m1-125cdc39e13ce7c237b7b4a9e1d8f21c.png Libpng decoder failed. bad adaptive filter value c-m1-19e0d1d0dfe97dca39e9d449c6b8b3d2.png Libpng decoder failed. Not enough image data c-m1-4bdd87fd0324f0a3d84d6905d17e1731.png Libpng decoder failed. bad adaptive filter value c-m1-559dcf17d281e285b7f09f943b9706de.png Libpng decoder failed. bad adaptive filter value c-m1-5e149c14dc7b7c16ff6bcedd1625ca31.png Libpng decoder failed. bad adaptive filter value c-m1-6593e140dba21ccb8c8724f8fe88fdb6.png Libpng decoder failed. bad adaptive filter value c-m1-6bfb149151f58d124d6fa76eaad75520.png Libpng decoder failed. Not enough image data c-m1-6e3914f26bcc8f9d004ffeac71656c01.png Libpng decoder failed. bad adaptive filter value c-m1-80e163ebface8b0d2fbf9823bca02936.png Libpng decoder failed. bad adaptive filter value c-m1-9a3e0c7b687b526987e2270541002d47.png Libpng decoder failed. bad adaptive filter value c-m1-a4842373fc20cc42b8e023a329761915.png Object reference not set to an instance of an object. c-m1-aded9dc1dc9361363ad0b426c2ff1846.png Libpng decoder failed. bad adaptive filter value c-m1-b977e74d9de1f6689fdd84c4e38830f5.png Libpng decoder failed. bad adaptive filter value c-m1-bfce28c0e44bc8d1824d48fbec5075e2.png Libpng decoder failed. bad adaptive filter value c-m1-c5a372c145ce25ce712959cd3b6df35e.png Libpng decoder failed. bad adaptive filter value c-m1-d87a07bdc461bf81e43447ca0620d71d.png Libpng decoder failed. bad adaptive filter value c-m1-fcac2d6a6a739e8ceb946ac99200d9f1.png Libpng decoder failed. bad adaptive filter value c-m2-0699098e769a2d80e60f33dbb3332b61.png Libpng decoder failed. bad adaptive filter value c-m2-272ae9468b7883e5cf61873a17271fb4.png Libpng decoder failed. bad adaptive filter value c-m2-559dcf17d281e285b7f09f943b9706de.png Libpng decoder failed. IDAT: invalid distance too far back c-m2-593d4b1a0b5d13b539c6c098dc5797ca.png Libpng decoder failed. bad adaptive filter value c-m2-66ac49ef3f48ac9482049e1ab57a53e9.png Libpng decoder failed. bad adaptive filter value c-m2-71915ab0b1cc7350091ef7073a312d16.png Libpng decoder failed. bad adaptive filter value c-m2-80e163ebface8b0d2fbf9823bca02936.png Libpng decoder failed. bad adaptive filter value c-m2-8f2b481b7fd9bd745e620b7c01a18df2.png Libpng decoder failed. bad adaptive filter value c-m2-96b70653ba3f8a83b7cfd48749bed8b1.png Libpng decoder failed. bad adaptive filter value c-m2-9a3e0c7b687b526987e2270541002d47.png Libpng decoder failed. bad adaptive filter value c-m2-a1f9d85a8243b884d40e74f656c55e75.png Libpng decoder failed. bad adaptive filter value c-m2-a46ce91d8975a017917156b8824f936e.png Libpng decoder failed. bad adaptive filter value c-m2-b977e74d9de1f6689fdd84c4e38830f5.png Libpng decoder failed. IDAT: invalid code -- missing end-of-block c-m2-fcac2d6a6a739e8ceb946ac99200d9f1.png Libpng decoder failed. bad adaptive filter value c-m3-593d4b1a0b5d13b539c6c098dc5797ca.png Libpng decoder failed. bad adaptive filter value c-m4-96b70653ba3f8a83b7cfd48749bed8b1.png Libpng decoder failed. bad adaptive filter value c-m5-a46ce91d8975a017917156b8824f936e.png Libpng decoder failed. bad adaptive filter value c-m6-a46ce91d8975a017917156b8824f936e.png Libpng decoder failed. IDAT: missing LZ dictionary c-m7-a46ce91d8975a017917156b8824f936e.png Libpng decoder failed. bad adaptive filter value c-m8-a46ce91d8975a017917156b8824f936e.png Libpng decoder failed. bad adaptive filter value c53911b0385c34a8204c30fdc14ea5cc.png Object reference not set to an instance of an object. c5c030bf52b9b2d8c45c88988fafff4f.png Object reference not set to an instance of an object. c636287a4d7cb1a36362f7f236564cef.png Object reference not set to an instance of an object. d3ffec5786387c590721e674d705f16e.png Libpng decoder failed. bad adaptive filter value dd18aac055d531e0e4ff8979458dbaa3.png Object reference not set to an instance of an object. e585afb2ecf50c04eaf0dedb71602cb8.png Specified argument was out of the range of valid values. (Parameter 'length') e76546768d4a8f2f4c39339345c7614c.png Object reference not set to an instance of an object. f6266c0e9c2f7db9fab0f84562f63b6c.png Object reference not set to an instance of an object. f757de9794666c3d14985210679bc98c.png Object reference not set to an instance of an object. m1-04c2707d63235dd5ab2c66ee98a36521.png Libpng decoder failed. bad adaptive filter value m1-125cdc39e13ce7c237b7b4a9e1d8f21c.png Libpng decoder failed. bad adaptive filter value m1-19e0d1d0dfe97dca39e9d449c6b8b3d2.png Libpng decoder failed. Not enough image data m1-1b5df699719c4a7cc8314ab9af139405.png Libpng decoder failed. bad adaptive filter value m1-272ae9468b7883e5cf61873a17271fb4.png Libpng decoder failed. bad adaptive filter value m1-4bdd87fd0324f0a3d84d6905d17e1731.png Libpng decoder failed. bad adaptive filter value m1-559dcf17d281e285b7f09f943b9706de.png Libpng decoder failed. bad adaptive filter value m1-5ae377bebf643e2e53ba7038103e48c4.png Libpng decoder failed. bad adaptive filter value m1-5e149c14dc7b7c16ff6bcedd1625ca31.png Libpng decoder failed. bad adaptive filter value m1-5efba06832cc674ae5d290ba7ebc2533.png Libpng decoder failed. bad adaptive filter value m1-6593e140dba21ccb8c8724f8fe88fdb6.png Libpng decoder failed. bad adaptive filter value m1-6bfb149151f58d124d6fa76eaad75520.png Libpng decoder failed. Not enough image data m1-6e3914f26bcc8f9d004ffeac71656c01.png Libpng decoder failed. bad adaptive filter value m1-80e163ebface8b0d2fbf9823bca02936.png Libpng decoder failed. bad adaptive filter value m1-814fcedc62fe4e43923c042ff1d6747f.png Libpng decoder failed. bad adaptive filter value m1-94f94e608d647b1b433f4d0ecc21e023.png Libpng decoder failed. bad adaptive filter value m1-96b70653ba3f8a83b7cfd48749bed8b1.png Libpng decoder failed. bad adaptive filter value m1-9a3e0c7b687b526987e2270541002d47.png Libpng decoder failed. bad adaptive filter value m1-9bec9d0461c0ef0f5faf16d0d4bdcc13.png Libpng decoder failed. bad adaptive filter value m1-9eb5b67f01da30f0e16062004c343e4a.png Libpng decoder failed. bad adaptive filter value m1-a46ce91d8975a017917156b8824f936e.png Libpng decoder failed. bad adaptive filter value m1-a4842373fc20cc42b8e023a329761915.png Object reference not set to an instance of an object. m1-aded9dc1dc9361363ad0b426c2ff1846.png Libpng decoder failed. bad adaptive filter value m1-b977e74d9de1f6689fdd84c4e38830f5.png Libpng decoder failed. bad adaptive filter value m1-bfce28c0e44bc8d1824d48fbec5075e2.png Libpng decoder failed. bad adaptive filter value m1-c5a372c145ce25ce712959cd3b6df35e.png Libpng decoder failed. bad adaptive filter value m1-d4b25a2b8b5fcec0a3e284579d539f35.png Libpng decoder failed. bad adaptive filter value m1-d87a07bdc461bf81e43447ca0620d71d.png Libpng decoder failed. bad adaptive filter value m1-fcac2d6a6a739e8ceb946ac99200d9f1.png Libpng decoder failed. bad adaptive filter value m2-0699098e769a2d80e60f33dbb3332b61.png Libpng decoder failed. bad adaptive filter value m2-272ae9468b7883e5cf61873a17271fb4.png Libpng decoder failed. bad adaptive filter value m2-559dcf17d281e285b7f09f943b9706de.png Libpng decoder failed. IDAT: invalid distance too far back m2-593d4b1a0b5d13b539c6c098dc5797ca.png Libpng decoder failed. bad adaptive filter value m2-66ac49ef3f48ac9482049e1ab57a53e9.png Libpng decoder failed. bad adaptive filter value m2-71915ab0b1cc7350091ef7073a312d16.png Libpng decoder failed. bad adaptive filter value m2-80e163ebface8b0d2fbf9823bca02936.png Libpng decoder failed. bad adaptive filter value m2-8f2b481b7fd9bd745e620b7c01a18df2.png Libpng decoder failed. bad adaptive filter value m2-94f94e608d647b1b433f4d0ecc21e023.png Libpng decoder failed. bad adaptive filter value m2-96b70653ba3f8a83b7cfd48749bed8b1.png Libpng decoder failed. bad adaptive filter value m2-9a3e0c7b687b526987e2270541002d47.png Libpng decoder failed. bad adaptive filter value m2-a1f9d85a8243b884d40e74f656c55e75.png Libpng decoder failed. bad adaptive filter value m2-a46ce91d8975a017917156b8824f936e.png Libpng decoder failed. bad adaptive filter value m2-b977e74d9de1f6689fdd84c4e38830f5.png Libpng decoder failed. IDAT: invalid code -- missing end-of-block m2-fcac2d6a6a739e8ceb946ac99200d9f1.png Libpng decoder failed. bad adaptive filter value m3-593d4b1a0b5d13b539c6c098dc5797ca.png Libpng decoder failed. bad adaptive filter value m3-71915ab0b1cc7350091ef7073a312d16.png Libpng decoder failed. bad adaptive filter value m3-96b70653ba3f8a83b7cfd48749bed8b1.png Libpng decoder failed. bad adaptive filter value m4-96b70653ba3f8a83b7cfd48749bed8b1.png Libpng decoder failed. bad adaptive filter value m5-a46ce91d8975a017917156b8824f936e.png Libpng decoder failed. bad adaptive filter value m6-a46ce91d8975a017917156b8824f936e.png Libpng decoder failed. IDAT: missing LZ dictionary m7-a46ce91d8975a017917156b8824f936e.png Libpng decoder failed. bad adaptive filter value m8-a46ce91d8975a017917156b8824f936e.png Libpng decoder failed. bad adaptive filter value Successfully converted 57/254

saucecontrol commented 8 months ago

Thanks for the report! I downloaded the Google test images myself but didn't run them all through yet. I expect we'll be able to get close to the WIC codec's behavior, but full parity is not necessarily achievable.

I think libpng's hard error on invalid filter value is a mistake in particular, because at worst it would lead to incorrect pixel values. Its check is only able to determine whether the value is in the correct range, so it still has to be able to deal with the possibility the value is incorrect but in range. I will patch this in my libpng builds to be a soft error.

The NullReferenceExceptions appear to be related to invalid color space matadata in the images, so those should be any easy fix as well.

saucecontrol commented 8 months ago

Thanks again for reporting this and for the detail.

As of https://github.com/saucecontrol/PhotoSauce/commit/a073734279b58f2461cdf0410243ca555de5c112 the libpng plugin decodes all but 4 of the files WIC does.

463d3570f92a6b6ecba0cc4fd9a7a384.png has double PLTE chunks. Chrome also fails to decode this. 7ce702ec69b7af26b3218d1278520bce.png has an invalid IHDR chunk. Chrome also fails to decode this. a1d1aafb5bca660229f8e9fc65291eab.png -- same as above. b583e48e218193e4c287f033931a6314.png has an invalid PLTE chunk (too many colors). This one is recoverable, but not with the way libpng is currently used. It will be taken care of in future.