2012-06-23 14 views
7

Busco la posibilidad de escribir un mapa de bits de 1 bit de una cadena con este contenido:1 bit de mapa de bits (monocromo) en php

$str = "001011000111110000"; 

Cero es blanco y uno es negro. El archivo BMP será de 18 x 1 px.

No quiero un BMP de 24 bits, pero un BMP real de 1 bit.

¿Alguien sabe el encabezado y el método de conversión en PHP?

+1

+1 para preguntas interesantes! – hexafraction

Respuesta

3

Eso es un poco de una extraña petición :)

Por lo tanto, lo que se desea utilizar aquí es php-gd, para empezar. En general, esto se incluye al instalar php en cualquier sistema operativo con repositorios decentes, pero solo en caso de que no sea para usted, puede obtener las instrucciones de instalación aquí;

http://www.php.net/manual/en/image.setup.php

En primer lugar, tendremos que averiguar exactamente qué tan grande la imagen tendrá que ser de ancho; la altura obviamente siempre será una.

So;

$str = $_GET['str']; 
$img_width = strlen($str); 

strlen nos dirá la cantidad de caracteres en la cadena str $, y ya que estamos dando un píxel por carácter, la cantidad de caracteres nos dará el ancho requerido.

Para facilitar el acceso, divida la cadena en una matriz, con cada elemento para cada píxel por separado.

$color_array = str_split($str); 

Ahora, establezcamos un "puntero", para qué píxel estamos dibujando. Es php, por lo que no NECESITA initalizar esto, pero es bueno estar ordenado.

$current_px = (int) 0; 

Y ahora puede inicializar GD y comenzar a hacer la imagen;

$im = imagecreatetruecolor($img_width, 1); 
// Initialise colours; 
$black = imagecolorallocate($im, 0, 0, 0); 
$white = imagecolorallocate($im, 255, 255, 255); 
// Now, start running through the array 
foreach ($color_array as $y) 
{ 
    if ($y == 1) 
    { 
    imagesetpixel ($im, $current_px , 1 , $black); 
    } 
    $current_px++; // Don't need to "draw" a white pixel for 0. Just draw nothing and add to the counter. 
} 

Esto dibujará su imagen, entonces todo lo que necesita hacer es mostrarlo;

header('Content-type: image/png'); 
imagepng($im); 
imagedestroy($im); 

Tenga en cuenta que la declaración blanca $ no es necesaria en absoluto - me dejó en para darle una idea de cómo se declara diferentes colores con Di-s.

Probablemente necesites depurar esto un poco antes de usarlo, hace mucho tiempo que no uso GD. De todos modos, espero que esto ayude!

+0

Gracias por su respuesta, pero estoy buscando un generador de bmp 1bit monocromo, posiblemente en php puro. ¡Finalmente encontré la forma correcta y la solución y ahora puedo generar una imagen monocromática correcta de 1 bit bmp! Con esta solución puedo generar una imagen ráster de código de barras con la dimensión más baja posible para el destripador de impresión. – htmlandrea

+0

Ah, ya veo. Bueno, encontré algunas clases que pueden ayudarte con el uso de GD para crear imágenes BMP; Puede encontrarlos aquí: http://www.phpclasses.org/package/5991-PHP-Load-and-save-images-in-the-BMP-format.html Espero que el resto de la información esté en menos útil para ti :) – Eoghan

+0

@htmlandrea: sería bueno si pudieras compartir la solución ... – Gonzo

0

NO es una solicitud extraña.

Estoy completamente de acuerdo con el propósito de la pregunta, de hecho tengo que administrar algunas imágenes monocromas de 1 bit.

La respuesta es:

  • GD no está bien documentada en el sitio web de PHP.
  • Cuando se desea crear una imagen a partir de cero que tienen que utilizar imagecreate() o imagecreatetruecolor()
  • Parece que los dos métodos que acabamos de mencionar (funciones) no puede crear imágenes de 1 bit de cero.
  • Lo resolví creando una imagen externa, png monocromático de 1 bit, cargándolo con imagecreatefrompng().

Además: Me acabas de descargar el código fuente abierto biblioteca oficial de aquí Official Bitbucket Repository

Lo que he encontrado en gd.h:?

La definición de las funciones mencionadas superiores:

/* Functions to manipulate images. */ 

/* Creates a palette-based image (up to 256 colors). */ 
BGD_DECLARE(gdImagePtr) gdImageCreate (int sx, int sy); 

/* An alternate name for the above (2.0). */ 
\#define gdImageCreatePalette gdImageCreate 

/* Creates a truecolor image (millions of colors). */ 
BGD_DECLARE(gdImagePtr) gdImageCreateTrueColor (int sx, int sy); 

Así que la solución "oficial" es: crear una imagen de paleta de color con 2 imagecreate() (que envuelve la func gdImageCreate() GD ion).

La solución "alternativa" es crear una imagen externa, png monocromático de 1 bit, y con imagecreatefrompng() como dije anteriormente.

Cuestiones relacionadas