PHP 5.4.33 Released

imagewbmp

(PHP 4 >= 4.0.1, PHP 5)

imagewbmpExportar la imagen al navegador o a un fichero

Descripción

bool imagewbmp ( resource $image [, string $filename [, int $foreground ]] )

imagewbmp() imprime o guarda una versión WBMP de la imagen image.

Parámetros

image

Un recurso image, es devuelto por una de las funciones de creación de imágenes, como imagecreatetruecolor().

filename

Ruta en la que guardar el fichero. Si no se establece, o su valor es NULL, se mostrará directamente en la salida el flujo de imagen.

foreground

Se puede establecer el color de primer plano con este parámetro estableciendo un identificador obtenido de imagecolorallocate(). El color de primer plano por defecto es negro.

Valores devueltos

Devuelve TRUE en caso de éxito o FALSE en caso de error.

Ejemplos

Ejemplo #1 Imprimir una imagen WBMP

<?php
// Crear una imagen en blanco y añadir algún texto
$im imagecreatetruecolor(12020);
$color_texto imagecolorallocate($im2331491);
imagestring($im155,  'A Simple Text String'$color_texto);

// Establecer la cabecera de tipo de contenido conveniente - es este caso image/vnd.wap.wbmp
// Consejo: vea image_type_to_mime_type() para los tipos de contenido
header('Content-Type: image/vnd.wap.wbmp');

// Imprimir la imagen
imagewbmp($im);

// Liberar memoria
imagedestroy($im);
?>

Ejemplo #2 Guardar una imagen WBMP

<?php
// Crear una imagen en blanco y añadir algún texto
$im imagecreatetruecolor(12020);
$color_texto imagecolorallocate($im2331491);
imagestring($im155,  'A Simple Text String'$color_texto);

// Guardar la imagen
imagewbmp($im'simpletext.wbmp');

// Liberar memoria
imagedestroy($im);
?>

Ejemplo #3 Imprimir la imagen con un primer plano diferente

<?php
// Crear una imagen en blanco y añadir algún texto
$im imagecreatetruecolor(12020);
$color_texto imagecolorallocate($im2331491);
imagestring($im155,  'A Simple Text String'$color_texto);

// Establecer la cabecera de tipo de contenido conveniente - es este caso image/vnd.wap.wbmp
// Consejo: vea image_type_to_mime_type() para los tipos de contenido
header('Content-Type: image/vnd.wap.wbmp');

// Esteblecer un color de primer plano sustituto
$color_primer_plano imagecolorallocate($im25500);

imagewbmp($imNULL$color_primer_plano);

// Liberar memoria
imagedestroy($im);
?>

Notas

Nota:

El soporte para WBMP sólo está disponible si PHP fue compilado con GD-1.8 o superior.

Ver también

  • image2wbmp() - Exportar la imagen al navegador o a un fichero
  • imagepng() - Imprimir una imagen PNG al navegador o a un archivo
  • imagegif() - Exportar la imagen al navegador o a un fichero
  • imagejpeg() - Exportar la imagen al navegador o a un fichero
  • imagetypes() - Devolver los tipos de imagen soportados por la versión actual de PHP

add a note add a note

User Contributed Notes 2 notes

up
0
andre at bynetworld dot com
6 years ago
In the previous note by -> lukeross at sys3175 dot co dot uk <- there is a coding error in the for() loops. After correcting the error, I found that this function did a great job of  converting color images to 2 colors.
The following is the corrected function code:

function ImageColorFloydSteinberg($dst_img, $src_img) {
    ImageColorAllocate($dst_img, 0,0,0);
    ImageColorAllocate($dst_img, 255,255,255);
    $isx = ImageSX($src_img);
    $isy = ImageSY($src_img);
    $grey_img = ImageCreate($isx, $isy);
    for ($a = 0; $a <= 255; $a++) ImageColorAllocate($grey_img, $a,$a,$a);
    $isx -= 1; // To correct pixel count in source image width starting from 0
    $isy -= 1; // Correcting pixel count in source image height starting from 0
    for($x = 0; $x <= $isx; $x++) {
        for($y = 0; $y <= $isy; $y++) {
            $color = ImageColorsForIndex($src_img, ImageColorAt($src_img, $x, $y));
            $greyscale = .299 * $color["red"] + .587 * $color["green"] + .114 * $color["blue"];
            ImageSetPixel($grey_img, $x, $y, ImageColorClosest($grey_img, $greyscale, $greyscale, $greyscale));
        }
    }
    for($x = 0; $x <= $isx; $x++) {
        for($y = 0; $y <= $isy; $y++) {
            $color = ImageColorsForIndex($grey_img, ImageColorAt($grey_img, $x, $y));
            if ($color["red"] > 128) {
                ImageSetPixel($dst_img, $x, $y, ImageColorClosest($dst_img,255,255,255));
                $err = $color["red"] - 255;
            } else {
                ImageSetPixel($dst_img, $x, $y, ImageColorClosest($dst_img,0,0,0));
                $err = $color["red"];
            }
            if ($x != $isx) {
                $color2 = ImageColorsForIndex($grey_img, ImageColorAt($grey_img, $x+1, $y));
                $newgrey = $color2["red"] + $err * 7 / 16;
                ImageSetPixel($grey_img, $x+1, $y, ImageColorClosest($grey_img,$newgrey, $newgrey, $newgrey));
            }
            if ($x != 0) {
                $color2 = ImageColorsForIndex($grey_img, ImageColorAt($grey_img, $x-1, $y));
                $newgrey = $color2["red"] + $err * 3 / 16;
                ImageSetPixel($grey_img, $x-1, $y, ImageColorClosest($grey_img,$newgrey, $newgrey, $newgrey));
            }
            if ($y != $isy) {
                $color2 = ImageColorsForIndex($grey_img, ImageColorAt($grey_img, $x, $y+1));
                $newgrey = $color2["red"] + $err * 5 / 16;
                ImageSetPixel($grey_img, $x, $y+1, ImageColorClosest($grey_img,$newgrey, $newgrey, $newgrey));
            }
            if ($x != $isx && $y != $isy) {
                $color2 = ImageColorsForIndex($grey_img, ImageColorAt($grey_img, $x+1, $y+1));
                $newgrey = $color2["red"] + $err / 16;
                ImageSetPixel($grey_img, $x+1, $y+1, ImageColorClosest($grey_img,$newgrey, $newgrey, $newgrey));
            }
          
        }
    }
    imagedestroy($grey_img);
}
up
0
lukeross at sys3175 dot co dot uk
12 years ago
As has been commented before, GD doesnt do a very good translation to 2-colours, especially for photos.  The following routine converts to two colours, I believe using error diffusion (the algorithm's nicked off news).  It's slow, but just about adequate for small images and low load.  I suspect it can be made much more efficient :-)

function ImageColorFloydSteinberg($dst_img, $src_img) {
    ImageColorAllocate($dst_img, 0,0,0);
    ImageColorAllocate($dst_img, 255,255,255);
    $grey_img = ImageCreate(ImageSX($src_img), ImageSY($src_img));
    for ($a = 0; $a <= 255; $a++) ImageColorAllocate($grey_img, $a,$a,$a);
    for($x = 0; $x <= ImageSX($src_img); $x++) {
        for($y = 0; $y <= ImageSY($src_img); $y++) {
            $color = ImageColorsForIndex($src_img, ImageColorAt($src_img, $x, $y));
            $greyscale = .299 * $color["red"] + .587 * $color["green"] + .114 * $color["blue"];
            ImageSetPixel($grey_img, $x, $y, ImageColorClosest($grey_img, $greyscale, $greyscale, $greyscale));
        }
    }
    for($x = 0; $x <= ImageSX($src_img); $x++) {
        for($y = 0; $y <= ImageSY($src_img); $y++) {
            $color = ImageColorsForIndex($grey_img, ImageColorAt($grey_img, $x, $y));
            if ($color["red"] > 128) {
                ImageSetPixel($dst_img, $x, $y, ImageColorClosest($dst_img,255,255,255));
                $err = $color["red"] - 255;
            } else {
                ImageSetPixel($dst_img, $x, $y, ImageColorClosest($dst_img,0,0,0));
                $err = $color["red"];
            }
            if ($x != ImageSx($src_img)) {
                $color2 = ImageColorsForIndex($grey_img, ImageColorAt($grey_img, $x+1, $y));
                $newgrey = $color2["red"] + $err * 7 / 16;
                ImageSetPixel($grey_img, $x+1, $y, ImageColorClosest($grey_img,$newgrey, $newgrey, $newgrey));
            }
            if ($x != 0) {
                $color2 = ImageColorsForIndex($grey_img, ImageColorAt($grey_img, $x-1, $y));
                $newgrey = $color2["red"] + $err * 3 / 16;
                ImageSetPixel($grey_img, $x-1, $y, ImageColorClosest($grey_img,$newgrey, $newgrey, $newgrey));
            }
            if ($y != ImageSy($src_img)) {
                $color2 = ImageColorsForIndex($grey_img, ImageColorAt($grey_img, $x, $y+1));
                $newgrey = $color2["red"] + $err * 5 / 16;
                ImageSetPixel($grey_img, $x, $y+1, ImageColorClosest($grey_img,$newgrey, $newgrey, $newgrey));
            }
            if ($x != ImageSx($src_img) && $y != ImageSy($src_img)) {
                $color2 = ImageColorsForIndex($grey_img, ImageColorAt($grey_img, $x+1, $y+1));
                $newgrey = $color2["red"] + $err / 16;
                ImageSetPixel($grey_img, $x+1, $y+1, ImageColorClosest($grey_img,$newgrey, $newgrey, $newgrey));
            }
           
        }
    }
    imagedestroy($grey_img);
}

To output your WBMP, use

ImageWBMP($final_img, "", ImageColorClosest(255,255,255));
To Top