2012-02-16 16 views
5

Estoy tratando de encontrar una manera más eficiente de crear una imagen de 1px por 1px (jpg, png y gif) desde un solo código de color RGB, en php .Cómo convertir RGB a 1px base64 datos codificados uri en php

El siguiente ejemplo ilustra un método para hacerlo, pero esperaba algún tipo de algoritmo que me diera el mismo resultado sin tener que cargar ninguna biblioteca o extensión de php.

Ejemplo:

function rgbToDataUri($r,$g,$b,$type) 
{ 
    $im = imageCreateTrueColor(1, 1); 

    imageFill($im, 0, 0, ImageColorAllocate($im,$r,$g,$b)); 

    ob_start(); 

    switch($type) 
    { 
     case 'gif': 
      imageGif($im); 
      break; 
     case 'jpg': 
     case 'jpeg': 
      imageJpeg($im); 
      break; 
     default: 
      imagePng($im); 
    } 

    $img = ob_get_contents(); 

    ob_end_clean(); 

    return 'data:image/' . $type . ';base64,' . base64_encode($img); 
} 

echo rgbToDataUri(0,0,0,'gif'); 

Salida:

data:image/gif;base64,R0lGODdhAQABAIAAAAQCBAAAACwAAAAAAQABAAACAkQBADs= 

Mis objetivos son (en orden de prioridad):

  1. Bajo consumo de memoria
  2. alta eficiencia procesador
  3. de alta velocidad de procesamiento

requisitos incluyen gif de apoyo, jpg y png. Entre 20 y 50 de estas imágenes de un solo píxel se crearán con cada solicitud (cada píxel es independiente de los demás).

¿Cómo se produce el binario para una imagen de un solo color de 1px?

+1

Su código es bastante simple/sencillo como es. Es casi seguro que no desea implementar todos los diversos formatos de imagen a mano. – Amber

+0

¿Qué tal dar salida a un BMP? Para un solo píxel, es casi tan eficiente como los otros tres formatos y es probablemente lo suficientemente simple para que pueda producir el binario directamente usando un poco de desplazamiento de bits y 'empaquetado 'sin mucho trabajo. – deceze

+0

@amber Desafortunadamente, la simplicidad no es el objetivo de este ejercicio en particular. –

Respuesta

0

No soy un experto en este campo. Pero me encontré con "ImageMagick", que es una extensión PHP nativa para crear y modificar imágenes. Puede leer, convertir y escribir imágenes en una variedad de formatos (más de 100) incluyendo DPX, EXR, GIF, JPEG, JPEG-2000, PDF, PhotoCD, PNG, Postscript, SVG y TIFF.

+2

Definitivamente no lo ayuda con sus objetivos: baja memoria, uso de la CPU, velocidad. – RobinUS2

+0

Gracias pero RobinUS2 tiene razón en este caso. –

0

Sugiero mantener una cadena binaria para cada imagen compatible de tamaño 1x1 píxeles y encontrar un lugar donde almacena los datos de color (utilizando las especificaciones disponibles). Luego, simplemente pone el color necesario allí y codifica la base64.

Esto debería hacer al menos para PNG y GIF. Tienen paletas y todos los datos de color se almacenan en un solo lugar. JPG, por otro lado, no posee un RGB simple, por lo que es un poco más complicado (y definitivamente no es la mejor opción para una imagen 1x1).

+0

He considerado este método, pero me temo que la recuperación (latencia) podría ser un cuello de botella demasiado para este ejercicio en particular. –

+0

@BillH Modificar 4 bytes en una cadena que ya está almacenada en la memoria es difícilmente un cuello de botella. Hacer la codificación base64 podría ser uno, pero también podría implementar la memoria caché codificada para los valores que tenía previamente o (si tiene algún conocimiento de datos) espera tener. Sin embargo, este último golpea el consumo de memoria, que es prio 1 sobre el uso de la CPU. – Lyth