yh5baeaaaaalaaaaaabaaeaaaibraa7 smallest small r0lgodlhaqabaiaaaaaaap data black php image-processing

php - smallest - small base64 image



Script PHP para renderizar un solo pixel transparente(PNG o GIF) (4)

En Linux puedes convertirlo escribiendo en la consola:

hexdump -v -e ''"///x" 1/1 "%X"'' image.gif; echo

Tengo que crear un PHP que devuelva una secuencia de imágenes de un punto transparente (PNG o GIF)

¿Podría indicarme una solución fácil de usar?


En PHP 5.4 y superior, es posible usar hex2bin , que es aproximadamente dos veces más rápido que base64_decode (probado con el archivo GIF en blanco a continuación). El código para las imágenes de salida sería:

Transparent 1x1 PNG:

header(''Content-Type: image/png''); die(hex2bin(''89504e470d0a1a0a0000000d494844520000000100000001010300000025db56ca00000003504c5445000000a77a3dda0000000174524e530040e6d8660000000a4944415408d76360000000020001e221bc330000000049454e44ae426082''));

Transparente 1x1 GIF:

header(''Content-Type: image/gif''); die(hex2bin(''47494638396101000100900000ff000000000021f90405100000002c00000000010001000002020401003b''));

Puede convertir fácilmente datos codificados en base64 en hexadecimales:

echo bin2hex(base64_decode($data));

O un archivo:

echo bin2hex(base64_decode(file_get_contents($filename)));

Sin embargo, utilizar el método de escape PHP nativo sugerido por @Lukas Liesis es el más rápido, aproximadamente 12.5 veces más rápido que el código base64, según mi punto de referencia. Y funcionaría con prácticamente cualquier versión de PHP. Aquí están los fragmentos de código:

Transparent 1x1 PNG:

header(''Content-Type: image/png''); die("/x89/x50/x4e/x47/x0d/x0a/x1a/x0a/x00/x00/x00/x0d/x49/x48/x44/x52/x00/x00/x00/x01/x00/x00/x00/x01/x01/x03/x00/x00/x00/x25/xdb/x56/xca/x00/x00/x00/x03/x50/x4c/x54/x45/x00/x00/x00/xa7/x7a/x3d/xda/x00/x00/x00/x01/x74/x52/x4e/x53/x00/x40/xe6/xd8/x66/x00/x00/x00/x0a/x49/x44/x41/x54/x08/xd7/x63/x60/x00/x00/x00/x02/x00/x01/xe2/x21/xbc/x33/x00/x00/x00/x00/x49/x45/x4e/x44/xae/x42/x60/x82");

Transparente 1x1 GIF:

header(''Content-Type: image/gif''); die("/x47/x49/x46/x38/x39/x61/x01/x00/x01/x00/x90/x00/x00/xff/x00/x00/x00/x00/x00/x21/xf9/x04/x05/x10/x00/x00/x00/x2c/x00/x00/x00/x00/x01/x00/x01/x00/x00/x02/x02/x04/x01/x00/x3b");

Crear una cadena así es fácil con expresiones regulares (como se hace una vez, no tiene que trabajar rápido):

echo preg_replace(''/../'',''//x/0'',bin2hex($data));

O desde un archivo:

echo preg_replace(''/../'',''//x/0'',bin2hex(file_get_contents($filename)));


Transparent 1x1 PNG:

header(''Content-Type: image/png''); echo base64_decode(''iVBORw0KGgoAAAANSUhEUgAAAAEAAAABAQMAAAAl21bKAAAAA1BMVEUAAACnej3aAAAAAXRSTlMAQObYZgAAAApJREFUCNdjYAAAAAIAAeIhvDMAAAAASUVORK5CYII='');

Transparente 1x1 GIF:

header(''Content-Type: image/gif''); echo base64_decode(''R0lGODlhAQABAJAAAP8AAAAAACH5BAUQAAAALAAAAAABAAEAAAICBAEAOw=='');


pocas respuestas a las preguntas de las personas:

tienes que repetir el contenido de la imagen. El encabezado muestra que no devuelve texto, sino imagen. Entonces, si devolvió el encabezado, es solo un encabezado, sin datos. Luego imprime los datos de la imagen y listo, solo envía la imagen :)

leer archivos no es bueno, podría funcionar, pero es mejor devolver los datos sin procesar como se muestra en la respuesta principal por Sjoerd. Solo porque guardas una operación de lectura. Leer desde el disco es una tarea lenta. Hoy en día, la velocidad aumenta con los discos SSD, pero aún así. No hay E / S en el disco es mejor.

Tenía este código incluso sin decodificación base64, pero esta imagen tiene color blanco:

header(''Content-Type: image/gif''); // 1x1px white gif die("/x47/x49/x46/x38/x37/x61/x1/x0/x1/x0/x80/x0/x0/xfc/x6a/x6c/x0/x0/x0/x2a/x0/x0/x0/x0/x1/x0/x1/x0/x0/x2/x2/x44/x1/x0/x3b");

¿Tal vez alguien sepa cómo convertir cualquier archivo a dicha cadena de datos?