php - 使用 PHP 和 ImageMagick 以编程方式将 RGB 图像转换为 1 位灰度 (b/w) 位图图像

标签 php bitmap imagemagick rgb grayscale

我正在尝试使用 PHP(版本:5.2.13)和 ImageMagick(版本:6.7.8-7-Q16)以编程方式将位图 RGB 图像转换为 1 位灰度 (b/w) 位图图像。输入图像是位图,通过 ImageMagick 函数生成:

bool Imagick::setFormat ( string $format )

其中 $format = 'bmp2'

以下代码过去可以工作(旧版本的 ImageMagick...不记得是哪一个),但在当前环境中不再工作:

private function monochrome() {
    if (isset($this->image)) {
        try {
            // reduce image colors to 2 (black and white)
            $this->image->quantizeImage(2, Imagick::COLORSPACE_GRAY, 5, false, true);

            // reduce image depth to 1 bit per pixel
            $this->image->setImageDepth(1);
            $this->image->setImageChannelDepth(Imagick::CHANNEL_ALL, 1);

            // set image type to monochrome (2 colors: black and white only)
            $this->image->setImageType(Imagick::IMGTYPE_BILEVEL);
        }
        catch (ImagickException $ie) {
            throw $ie;
        }
    }
    else {
        throw new Exception("No image object");
    }
}

问题是生成的图像仍然在 RGB 颜色空间中。

我也试过:

$this->image->setImageColorSpace(Imagick::COLORSPACE_GRAY);

但结果没有改变。

我的目标是为签名捕获应用程序生成尽可能小的黑白位图图像。我知道有比位图更好的图像格式,但生成的图像必须与旧的 Access 97 兼容。这就是为什么选择“bmp2”图像格式的原因。

有什么想法吗?谢谢!

最佳答案

我只做了这个,它创建了一个黑白图像:

$im = new Imagick();
$im->readimage($filename);
$im->resizeimage($width, $height, Imagick::FILTER_UNDEFINED, 1, false);
$im->posterizeimage(2, false);
$im->writeimage($filename.".bmp");

它创建了一个像这样标识的图像:

$ identify example.png.bmp 
example.png.bmp BMP 1742x236 1742x236+0+0 1-bit PseudoClass 2c 52.1KB 0.000u 0:00.000

2c 表示它只包含 2 个颜色,但是 hte 图像没有颜色索引表。

关于php - 使用 PHP 和 ImageMagick 以编程方式将 RGB 图像转换为 1 位灰度 (b/w) 位图图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13433490/

相关文章:

asp.net - 如何使用 C# 在 ASP.NET 中识别 CMYK 图像

image-processing - 提取内部轮廓(HOLES)OpenCV

javascript - Google Analytics 和自己的数据收集之间存在巨大差异

php - 将 SWF 转换为 PNG

php - 如何在 PHP 5.x 上安装 http_pecl?

linux - 使用终端显示图像而不会失去焦点

linux - 如何对子文件夹中的所有图像使用 ImageMagick 转换命令

php - 如何使用 PHP 加密和解密 PDF?

c# - 从 MVVM/WPF 中的 BackgroundWorker 更新位图

c++ - 如何将这个新的 char** 写入 .bmp 文件?