使用PHP和ImageMagick编写程序将RGB图像转换为一位灰度(黑白)位图图像。

4
我正在尝试使用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”作为图像格式的原因。

有什么想法吗?谢谢!


1
@carlos-c-soto建议的解决方案完美地运行了。我只需要用posterizeimage(2, false)替换quantizeImage(2, Imagick :: COLORSPACE_GRAY, 5, false, true)。 - AlexB
2个回答

3

我只是创建了这个,它会生成一张黑白图像:

$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种颜色,但是该图片没有一个索引颜色表。

非常感谢!posterizeimage(2,false)运行得很好。终于,在将近一年之后,我让那段代码工作了! - AlexB
不客气,我已经用它来与一个印章硬件一起工作了。我还在.Net上实现了这段代码,并使用mono运行它,但是当将位图保存到内存时,它经常失败。 - Carlos C Soto

0
    my $image = Image::Magick->new;
    $image->Read($imagePath);
    $image->Quantize(colorspace=>"gray"):
    $image->Set(density => '72x72');

这个例子是用perl编写的,你可以很容易地将它转换成php...


你所提出的(量化)正是我的代码所做的。设置分辨率根本没有帮助。 - AlexB
对我来说,这段代码运行良好,也许你有另外的问题,尝试使用不同的图片。 - grigno

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接