使用ImageMagick++修改图像对比度/亮度

4
我正在尝试对内存中的位图应用对比度和亮度,但我完全迷失了方向。目前我正在尝试使用Magick++来完成它,但如果其他API可以更好地工作,我会听取建议。我设法找到了Magick::Image::sigmoidalContrast()函数来应用对比度,但我无法弄清楚如何让它起作用。我创建了一个图像,将缓冲指针传递给它,然后调用该函数,但似乎没有任何变化,所以我的第一个想法是它在制作副本并修改那个副本。即便如此,我也不知道如何从Magick::Image对象中获取数据。
以下是我目前的代码:
Magick::Image image(fBitmapData->mGetTextureWidth(), fBitmapData->mGetTextureHeight(), "RGBA", MagickCore::CharPixel, pixels);
image.sigmoidalContrast(1, 20.0);

文档无用,搜索后只能找到一些提示,第一个参数实际上是布尔值,尽管它采用了 size_t,指定是添加还是减少对比度,而第二个值则是我不知道该传递什么,所以我只是使用 20.0 进行测试。
那么,有人知道这是否适用于对比度,如果不是,那么如何应用对比度?同样,我仍然不知道如何应用亮度,也找不到任何看起来可以工作的函数。
2个回答

6

我明白了;我使用的对比度函数是正确的,而为了调整亮度,我最终采用了image.modulate(brightness, 100.0, 100.0);。要从图像对象中获取数据,您可以通过执行以下操作抓取整个图像的像素:

const MagickCore::PixelPacket * magickPixels = image.getConstPixels(0, 0, image.columns(), image.rows());

然后将magickPixels数据复制回传递到图像构造函数中的原始pixels。重要的一点是成员MagickCore::PixelPacket::opacity不是你想的那样,如果像素完全透明,你会认为该值为0,对吧?但是由于某种原因,ImageMagick正好相反。因此,完全透明的值将为255。这意味着您需要执行 255-opacity 以获取正确的值。
同时要注意ImageMagick编译时使用的MAGICKCORE_QUANTUM_DEPTH,因为这将大大改变值。对于我的代码,MAGICKCORE_QUANTUM_DEPTH恰好被定义为16,因此所有值都在0到65535的范围内,我只需在复制数据时进行 realValue = magickValue >> 8 处理,因为纹理数据是unsigned char值。
为了澄清如何使用这些函数(因为文档很糟糕且完全错误),signmoidalContrast()的第一个参数实际上是布尔值(尽管类型是size_t),指定是增加对比度(true)还是减少它(false),第二个参数是从0.00001到20.0的范围。我说0.00001是因为0.0是无效值,所以它只需要一些接近但不完全等于0.0的小数即可。
对于 modulate(),文档说每个值应指定为1.0以保持不变,这是完全错误的。实际上,这些值是百分比,因此要保持不变,应将其指定为100.0。
希望这可以帮助某人,因为我整天都在弄明白这些东西。

我一直在想为什么我的图像变成了黑色。原来如此! - Alexis Wilke

1

根据Imagemagick网站 - 适用于命令行但可能相同?

-sigmoidal-contrast contrastxmid-point

增加对比度而不饱和高光或阴影。

使用S形转移函数增加图像的对比度,而不会饱和高光或阴影。对比度表示要增加多少对比度。例如,接近0是没有,3是典型值,20是很多。请注意,恰好为零是无效的,但0.0001与对比度没有变化几乎没有区别。中间点表示中间色调在结果图像中的位置(0为白色;50%为中灰色;100%为黑色)。默认情况下,图像对比度会增加,使用+sigmoidal-contrast来降低对比度。

要实现类似于S形亮度更改的等效效果,请使用-sigmoidal-contrast brightnessx0%来增加亮度,使用+sigmoidal-contrast brightnessx0%来降低亮度。

在命令行中,有一个新的亮度对比度设置,可能在后续版本的magic++中出现?

-亮度-对比度 亮度{x对比度}{%}} 调整图像的亮度和/或对比度。
亮度和对比度值应用于输入图像。它们不是绝对设置。亮度或对比度值为零表示没有变化。每个值的范围为-100到+100。正值增加亮度或对比度,负值减少亮度或对比度。要仅控制对比度,请将亮度设置为0。要仅控制亮度,请将对比度设置为0或只留下它。
您还可以使用-channel来控制应用亮度和/或对比度更改的通道。默认情况下,将相同的转换应用于所有通道。
亮度和对比度参数被转换为线性变换的偏移和斜率,并使用-function polynomial“slope,offset”应用。
斜率从对比度=-100时的0变化到对比度=+100时的几乎垂直。对于亮度=0和对比度=-100,结果完全是中灰色的。对于亮度=0和对比度=+100,结果将接近但不会完全达到中灰色的阈值;也就是说,线性变换在中间灰色处是一条非常陡峭的垂直线。
此功能不支持负斜率,即否定图像。所有可实现的斜率都为零或正值。
偏移量从亮度=-100时的-0.5变化到亮度=0时的0,再到亮度=+100时的+0.5。因此,当对比度=0且亮度=100时,结果完全是白色的。同样,当对比度=0且亮度=-100时,结果完全是黑色的。
由于参数的值范围为-100到+100,因此添加“%”符号与不添加它没有任何区别。
如果 Magick++ 类似于 Imagick,那么它可能远远落后于 Imagemagick 的选项。

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