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));
imagewbmp
(PHP 4 >= 4.0.1, PHP 5)
imagewbmp — Gibt das Bild im Browser oder einer Datei aus.
Beschreibung
$image
[, string $filename
[, int $foreground
]] )
imagewbmp() outputs or save a WBMP
version of the given image.
Parameter-Liste
-
image -
Eine von den verschiedenen Erzeugungsfunktionen wie imagecreatetruecolor() gelieferte Grafikressource.
-
filename -
Der Pfad unter dem das Bild gespeichert werden soll. Ist dies nicht gesetzt oder
NULLwird der rohe Bilddatenstrom direkt ausgegeben. -
foreground -
You can set the foreground color with this parameter by setting an identifier obtained from imagecolorallocate(). The default foreground color is black.
Rückgabewerte
Gibt bei Erfolg TRUE zurück. Im Fehlerfall wird FALSE zurückgegeben.
Beispiele
Beispiel #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);
?>
Beispiel #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);
?>
Beispiel #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);
?>
Anmerkungen
Hinweis:
WBMP support is only available if PHP was compiled against GD-1.8 or later.
Siehe auch
- image2wbmp() - Gibt das Bild im Browser oder einer Datei aus.
- imagepng() - Ausgabe eines Bildes im Browser oder als Datei im PNG-Format
- imagegif() - Gibt das Bild im Browser oder einer Datei aus.
- imagejpeg() - Gibt das Bild im Browser oder einer Datei aus.
- imagetypes() - Gibt die von der aktuell verwendeten PHP-Version unterstützten Grafik-Formate zurück
imagewbmp
28-Feb-2002 10:57
17-Jul-2001 02:10
You could also use:
@ImageWbmp ($im, "test.wbmp");
But I haven't test ist yet
23-May-2001 12:34
There is a hidden third parameter in the ImageWbmp function that serves as a threshold-holder. When using the function as in:
ImageWbmp ($im, "test.wbmp");
it generates a warning:
Warning: imagewbmp: invalid threshold value '-1'. It must be between 0 and 255 in blablabla
It does generate the image though but for a WML app. it cannot be used since the warning is laden with HTML-tags. To prevent the warning use the following example:
ImageWbmp ($im, "test.wbmp", 0);
The warning is no longer generated.