imagewbmp

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

imagewbmp将图像输出到浏览器或文件

描述

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

imagewbmp() 输出或保存给定 imageWBMP 版本。

参数

image

一个 GdImage 对象,由其中一个图像创建函数返回,例如 imagecreatetruecolor()

file

要保存文件的路径或打开的流资源(此函数返回后会自动关闭)。如果未设置或为 null,则原始图像流将直接输出。

foreground_color

通过设置从 imagecolorallocate() 获得的标识符,可以设置此参数的前景颜色。默认前景颜色为黑色。

返回值

成功时返回 true,失败时返回 false

注意

但是,如果 libgd 无法输出图像,则此函数将返回 true

变更日志

版本 描述
8.0.0 image 现在期望一个 GdImage 实例;以前,期望一个有效的 gd resource
8.0.0 foreground_color 现在可以为空。

示例

示例 #1 输出 WBMP 图像

<?php
// 创建一个空白图像并添加一些文本
$im = imagecreatetruecolor(120, 20);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5, 'A Simple Text String', $text_color);

// 设置内容类型头 - 在这种情况下为 image/vnd.wap.wbmp
// 提示:有关内容类型,请参见 image_type_to_mime_type()
header('Content-Type: image/vnd.wap.wbmp');

// 输出图像
imagewbmp($im);

// 释放内存
imagedestroy($im);
?>

示例 #2 保存 WBMP 图像

<?php
// 创建一个空白图像并添加一些文本
$im = imagecreatetruecolor(120, 20);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5, 'A Simple Text String', $text_color);

// 保存图像
imagewbmp($im, 'simpletext.wbmp');

// 释放内存
imagedestroy($im);
?>

示例 #3 使用不同的前景颜色输出图像

<?php
// 创建一个空白图像并添加一些文本
$im = imagecreatetruecolor(120, 20);
$text_color = imagecolorallocate($im, 233, 14, 91);
imagestring($im, 1, 5, 5, 'A Simple Text String', $text_color);

// 设置内容类型头 - 在这种情况下为 image/vnd.wap.wbmp
// 提示:有关内容类型,请参见 image_type_to_mime_type()
header('Content-Type: image/vnd.wap.wbmp');

// 设置替换前景颜色
$foreground_color = imagecolorallocate($im, 255, 0, 0);

imagewbmp($im, NULL, $foreground_color);

// 释放内存
imagedestroy($im);
?>

参见

添加注释

用户贡献的注释 2 个注释

andre at bynetworld dot com
16 年前
在之前由 -> lukeross at sys3175 dot co dot uk <- 撰寫的筆記中,for() 循环存在编码错误。纠正错误后,我发现此函数在将彩色图像转换为 2 色方面做得很好。
以下是更正后的函数代码

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; // 为了从 0 开始纠正源图像宽度的像素数
$isy -= 1; // 纠正源图像高度的像素数,从 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);
}
lukeross at sys3175 dot co dot uk
22 年前
正如之前评论中提到的,GD 在转换为 2 色时表现不佳,尤其是对于照片而言。以下例程转换为两种颜色,我认为使用了误差扩散(算法来自新闻)。它很慢,但对于小图像和低负载来说足够。我认为它可以变得更加高效 :-)

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);
}

要输出您的 WBMP,请使用

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