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

时间:2012-06-11 02:33:52

标签: c++ bitmap imagemagick brightness contrast

我正在尝试将对比度和亮度应用于内存中的位图,我完全迷失了。目前我正在尝试使用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 个答案:

答案 0 :(得分:5)

想出来;我使用的对比度函数是正确的,对于亮度我最终使用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,它指定是否增加对比度(真)或减少它(假),第二个是0.00001到20.0的范围。我说0.00001因为0.0是一个无效值所以它只需要一些接近但不完全为0.0的小数。

对于modulate(),文档说每个值都应指定为1.0,不做任何更改,这是完全错误的。这些值实际上是一个百分比,因此如果没有更改,您将指定100.0。

我希望能有所帮助,因为我花了很大的时间来解决这个问题。

答案 1 :(得分:1)

根据Imagemagick网站 - 对于命令行但可能是相同的吗?

  

-sigmoidal-contrast contrastxmid-point

     

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

     

使用S形传递函数增加图像的对比度,而不会使高光或阴影饱和。对比度表示增加对比度的程度。例如,0附近是没有,3是典型的,20是很多。请注意,正好为零无效,但0.0001与对比度无变化的可忽略不计。中点表示中间体落在合成图像中的位置(0为白色; 50%为中灰色; 100%为黑色)。默认情况下,图像对比度增加,使用+ Sigmoidal-contrast来降低对比度。

     

要达到相当于S形亮度变化的效果,请使用-sigmoidal-contrast brightnessx0%来增加亮度,使用class =“arg”> + sigmoidal-contrast brightnessx0%来降低亮度。

在命令行上有一个新的亮度对比度设置,可能是魔术++的更高版本?

  

-brightness-contrast brightness {xcontrast} {%}}

     

调整图像的亮度和/或对比度。

     

亮度和对比度值会对输入图像应用更改。它们不是绝对的设置。亮度或对比度值为零意味着没有变化。每个值的范围是-100到+100。正值会增加亮度或对比度,负值会降低亮度或对比度。要仅控制对比度,请将亮度设置为0。要仅控制亮度,请设置对比度= 0或将其关闭。

     

您也可以使用-channel控制应用亮度和/或对比度变化的通道。默认设置是将相同的转换应用于所有通道。

     

亮度和对比度参数将转换为线性变换的偏移和斜率,并使用函数多项式“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选项