Comenzando con png

libpng versión 1.6.21

Libpng se escribió como complemento de la especificación PNG como una forma de reducir la cantidad de tiempo y esfuerzo que se necesita para admitir el formato de archivo PNG en los programas de aplicación.

Libpng fue diseñado para manejar múltiples sesiones a la vez, para ser fácilmente modificable, para ser portátil a la gran mayoría de las máquinas (ANSI, K&R, 16, 32 y 64 bits) disponibles y para ser fácil de usar. El objetivo final es promover la aceptación del formato PNG de cualquier manera posible. Si bien aún queda trabajo por hacer (consulte el archivo TODO), libpng debería cubrir la mayoría de las necesidades de los usuarios.

Límites de usuarios:

La especificación PNG permite que el ancho y el alto de una imagen sean tan grandes como 2^31-1 (0x7fffffff), o alrededor de 2147 millones de filas y columnas. Por seguridad, libpng impone un límite predeterminado de 1 millón de filas y columnas. Las imágenes más grandes serán rechazadas inmediatamente con una llamada png_error(). Libpng puede rechazar imágenes muy anchas debido a posibles condiciones de desbordamiento del búfer, pero puede establecer sus propios límites con:

png_set_user_limits(png_ptr, width_max, height_max);

Pon esta declaración después de crear la estructura PNG y antes de llamar a png_read_info(), png_read_png() o png_process_data().

Al escribir un flujo de datos PNG, coloque esta declaración antes de llamar a png_write_info() o png_write_png().

Para recuperar los límites que se están aplicando, use

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

La especificación PNG no establece ningún límite en la cantidad de fragmentos auxiliares permitidos en un flujo de datos PNG. Por defecto, libpng impone un límite de un total de 1000 sPLT, tEXt, iTXt, zTXt y fragmentos desconocidos para almacenar. SI tanto info_ptr como end_info_ptr están configurados, el límite se aplica por separado a cada uno. Cambie el límite en el número total de dichos fragmentos que se almacenarán con:

png_set_chunk_cache_max(png_ptr, user_chunk_cache_max);

donde 0x7ffffffffL significa ilimitado. Puede recuperar este límite con:

chunk_cache_max = png_get_chunk_cache_max(png_ptr);

Libpng impone un límite de 8 megabytes (8 000 000 bytes) en la cantidad de memoria que puede ocupar un fragmento comprimido que no sea IDAT, cuando se descomprime. Puede cambiar este límite con:

png_set_chunk_malloc_max(png_ptr, user_chunk_malloc_max);

y puedes recuperar el límite con:

chunk_malloc_max = png_get_chunk_malloc_max(png_ptr);

Se ignorarán todos los fragmentos que hagan que se exceda cualquiera de estos límites.

Detectando la versión de libpng:

La función png_get_io_ptr() ha estado presente desde libpng-0.88, nunca cambiado, y no se ve afectado por las macros de compilación condicional. Es el mejor opción para usar en scripts de configuración para detectar la presencia de cualquier Versión libpng desde 0.88. En un autoconf “configure.in” podría usar

AC_CHECK_LIB(png, png_get_io_ptr, ...