pngAan de slag met png


Opmerkingen

Portable Network Graphics is een raster grafisch bestandsformaat dat verliesvrije datacompressie ondersteunt. PNG is gemaakt als een verbeterde, niet-gepatenteerde vervanging voor Graphics Interchange Format (GIF) en is het meest gebruikte verliesvrije beeldcompressieformaat op internet.

PNG ondersteunt op paletten gebaseerde afbeeldingen (24-bits RGB- of 32-bits RGBA-kleuren), afbeeldingen in grijswaarden (met of zonder alfakanaal) en full-colour, niet-palette RGB [A] -afbeeldingen met een optioneel alfakanaal. PNG is ontworpen voor het overbrengen van afbeeldingen op internet, niet voor grafische afbeeldingen van professionele kwaliteit en ondersteunt geen niet-RGB-kleurruimten zoals CMYK.

PNG-bestanden gebruiken bijna altijd de bestandsextensie PNG of png en krijgen MIME-mediatype image / png toegewezen. PNG werd goedgekeurd voor gebruik door de Internet Engineering Steering Group op 14 oktober 1996 en werd in 2004 gepubliceerd als ISO / IEC-norm.


Voor beeldbewerking, professioneel of anderszins, biedt PNG een handig formaat voor het opslaan van tussenliggende bewerkingsstadia. PNG-compressie is volledig verliesloos en ondersteunt tot 48-bits truecolor of 16-bits grijswaarden. Daarom zal het opslaan, herstellen en opnieuw opslaan van een afbeelding de kwaliteit ervan niet verminderen in tegenstelling tot standaard JPEG (zelfs bij de hoogste JPEG-instellingen). In tegenstelling tot TIFF laat de PNG-specificatie geen ruimte voor implementators om te kiezen welke functies ze willen ondersteunen; een PNG-afbeelding opgeslagen in één app is leesbaar in elke andere PNG-ondersteunende applicatie.

Merk op dat voor verzending van afgewerkte truecolor-afbeeldingen, vooral fotografische, JPEG bijna altijd een betere keuze is. JPEG's compressie met verlies kan zichtbare artefacten introduceren, maar deze kunnen worden geminimaliseerd en de besparingen in bestandsgrootte zijn zelfs bij hoge kwaliteitsniveaus veel beter dan in het algemeen mogelijk is met een verliesloos formaat zoals PNG. Voor zwart-witafbeeldingen, met name van tekst of tekeningen, zijn TIFF's Groep 4 faxcompressie of het JBIG-formaat vaak veel beter dan 1-bit grijswaarden PNG.


De compressie van PNG is een van de beste die kan worden verkregen zonder beeldinformatie te verliezen en zonder patentkosten te betalen. Maar niet alle implementaties maken optimaal gebruik van de beschikbare kracht. Zelfs degenen die dat wel doen, kunnen worden gedwarsboomd door onverstandige keuzes van de kant van de gebruiker.

versies

png

Versie Publicatiedatum
1.0 1996/10/01
RFC-2083 1997/03/31
1.1 1999/02/15
1.2 1999/07/14
ISO / IEC 15948: 2003 2003/11/10
ISO / IEC 15948: 2004 2004-03-03

libpng versie 1.6.21

Libpng is geschreven als aanvulling op de PNG-specificatie om de hoeveelheid tijd en moeite te verminderen die nodig is om het PNG-bestandsformaat in toepassingsprogramma's te ondersteunen.

Libpng is ontworpen om meerdere sessies tegelijk af te handelen, gemakkelijk aan te passen, draagbaar te zijn voor de overgrote meerderheid van de beschikbare machines (ANSI, K&R, 16-, 32- en 64-bit) en eenvoudig te gebruiken. Het uiteindelijke doel is om de acceptatie van het PNG-formaat op elke mogelijke manier te bevorderen. Hoewel er nog werk aan de winkel is (zie het TODO-bestand), zou libpng de meeste gebruikersbehoeften moeten dekken.

Gebruiker limieten:

Met de PNG-specificatie kan de breedte en hoogte van een afbeelding zo groot zijn als 2 ^ 31-1 (0x7fffffff), of ongeveer 2.147 miljard rijen en kolommen. Voor veiligheid legt libpng een standaardlimiet op van 1 miljoen rijen en kolommen. Grotere afbeeldingen worden onmiddellijk geweigerd met een png_error() . Libpng kan zeer brede afbeeldingen weigeren vanwege mogelijke bufferoverloopvoorwaarden, maar u kunt uw eigen limieten instellen met:

png_set_user_limits(png_ptr, width_max, height_max);
 

Plaats deze instructie na het maken van de PNG-structuur en voordat u png_read_info() , png_read_png() of png_process_data() .

Wanneer u een PNG-gegevensstroom schrijft, moet u deze verklaring plaatsen voordat u png_write_info() of png_write_png() .

Gebruik om de limieten op te halen die worden toegepast

width_max = png_get_user_width_max(png_ptr);
height_max = png_get_user_height_max(png_ptr);
 

De PNG-specificatie stelt geen limiet aan het aantal aanvullende brokken dat is toegestaan in een PNG-datastroom. Standaard legt libpng een limiet op van in totaal 1000 sPLT, tEXt, iTXt, zTXt en onbekende chunks die moeten worden opgeslagen. Als zowel info_ptr als end_info_ptr zijn ingesteld, is de limiet voor elk afzonderlijk van toepassing. Wijzig de limiet op het totale aantal van dergelijke brokken dat moet worden opgeslagen met:

png_set_chunk_cache_max(png_ptr, user_chunk_cache_max);
 

waarbij 0x7fffffffL onbeperkt betekent. U kunt deze limiet ophalen met:

chunk_cache_max = png_get_chunk_cache_max(png_ptr);
 

Libpng legt een limiet van 8 Megabytes (8.000.000 bytes) op de hoeveelheid geheugen die een ander gecomprimeerd deel dan IDAT kan innemen wanneer het wordt gedecomprimeerd. U kunt deze limiet wijzigen met:

png_set_chunk_malloc_max(png_ptr, user_chunk_malloc_max);
 

en u kunt de limiet ophalen met:

chunk_malloc_max = png_get_chunk_malloc_max(png_ptr);
 

Stukken die ervoor zorgen dat een van deze limieten wordt overschreden, worden genegeerd.

Libpng-versie detecteren:

De functie png_get_io_ptr() is aanwezig sinds libpng-0.88, is nooit gewijzigd en wordt niet beïnvloed door voorwaardelijke compilatiemacro's. Het is de beste keuze voor gebruik in configuratiescripts voor het detecteren van de aanwezigheid van een libpng-versie sinds 0.88. In een autoconf "configure.in" die je zou kunnen gebruiken

AC_CHECK_LIB(png, png_get_io_ptr, ...