PHP 8.4.2 Released!

imagewbmp

(PHP 4 >= 4.0.1, PHP 5, PHP 7, PHP 8)

imagewbmpOutput image to browser or file

Description

imagewbmp(GdImage $image, resource|string|null $file = null, ?int $foreground_color = null): bool

imagewbmp() outputs or save a WBMP version of the given image.

Parameters

image

A GdImage object, returned by one of the image creation functions, such as imagecreatetruecolor().

file

The path or an open stream resource (which is automatically closed after this function returns) to save the file to. If not set or null, the raw image stream will be output directly.

foreground_color

You can set the foreground color with this parameter by setting an identifier obtained from imagecolorallocate(). The default foreground color is black.

Return Values

Returns true on success or false on failure.

Caution

However, if libgd fails to output the image, this function returns true.

Changelog

Version Description
8.0.0 image expects a GdImage instance now; previously, a valid gd resource was expected.
8.0.0 foreground_color is nullable now.

Examples

Example #1 Outputting a WBMP image

<?php
// Create a blank image and add some text
$im = imagecreatetruecolor(120, 20);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5, 'A Simple Text String', $text_color);

// Set the content type header - in this case image/vnd.wap.wbmp
// Hint: see image_type_to_mime_type() for content-types
header('Content-Type: image/vnd.wap.wbmp');

// Output the image
imagewbmp($im);

// Free up memory
imagedestroy($im);
?>

Example #2 Saving the WBMP image

<?php
// Create a blank image and add some text
$im = imagecreatetruecolor(120, 20);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5, 'A Simple Text String', $text_color);

// Save the image
imagewbmp($im, 'simpletext.wbmp');

// Free up memory
imagedestroy($im);
?>

Example #3 Outputting the image with a different foreground

<?php
// Create a blank image and add some text
$im = imagecreatetruecolor(120, 20);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5, 'A Simple Text String', $text_color);

// Set the content type header - in this case image/vnd.wap.wbmp
// Hint: see image_type_to_mime_type() for content-types
header('Content-Type: image/vnd.wap.wbmp');

// Set a replacement foreground color
$foreground_color = imagecolorallocate($im, 255, 0, 0);

imagewbmp($im, NULL, $foreground_color);

// Free up memory
imagedestroy($im);
?>

See Also

add a note

User Contributed Notes 2 notes

up
2
andre at bynetworld dot com
17 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
1
lukeross at sys3175 dot co dot uk
22 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