您好,我使用了ColorMatrix进行图像的反色,对于有些彩色图像是正确的,而有些则有一些噪点,能帮我诊断下吗?

laviewpbt 2008-08-30 08:22:32
我估计是SetColorMatrix中的catype影响,虽然我用的是VB,估计你能看懂。

Dim Image As Long, Graphics As Long
Dim ImgAttr As Long
Dim Matrix(0 To 4, 0 To 4) As Single
Matrix(0, 0) = -1: Matrix(1, 0) = 0: Matrix(2, 0) = 0: Matrix(3, 0) = 0: Matrix(4, 0) = 0
Matrix(0, 1) = 0: Matrix(1, 1) = -1: Matrix(2, 1) = 0: Matrix(3, 1) = 0: Matrix(4, 1) = 0
Matrix(0, 2) = 0: Matrix(1, 2) = 0: Matrix(2, 2) = -1: Matrix(3, 2) = 0: Matrix(4, 2) = 0
Matrix(0, 3) = 0: Matrix(1, 3) = 0: Matrix(2, 3) = 0: Matrix(3, 3) = 1: Matrix(4, 3) = 0
Matrix(0, 4) = 0: Matrix(1, 4) = 0: Matrix(2, 4) = 0: Matrix(3, 4) = 0: Matrix(4, 4) = 1

GdipCreateBitmapFromHBITMAP PicSource.Image.Handle, 0, Image
GdipCreateFromHDC PicDest.hdc, Graphics
GdipGetImageWidth Image, Width
GdipGetImageHeight Image, Height
GdipCreateImageAttributes ImgAttr
'http://blog.csdn.net/maozefa/archive/2007/12/27/1995949.aspx
GdipSetImageAttributesColorMatrix ImgAttr, ColorAdjustTypeBitmap, True, Matrix(0, 0), 0, 1
GdipDrawImageRectRectI Graphics, Image, 0, 0, Width, Height, 0, 0, Width, Height, UnitPixel, ImgAttr, 0, 0
GdipDisposeImageAttributes ImgAttr
GdipDeleteGraphics Graphics
GdipDisposeImage Image

PicDest.Refresh


原始图像


反色后的结果

可以看到,有些点的效果不对。但是对于打部分图像,效果是没有问题的。

不知道是怎么回事,catype的值为0,1,2我都试过,但是对于这幅图像就是不行。
请您有空能帮我诊断一下吗,谢谢。

...全文
774 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
laviewpbt 2008-09-12
  • 打赏
  • 举报
回复
知道了,这是GDI+的无赖。
阿发伯 2008-09-11
  • 打赏
  • 举报
回复
关于反色的问题,我已经做了彻底的探讨,并由此写了一篇文章,可供参考:

http://blog.csdn.net/maozefa/archive/2008/09/08/2896752.aspx
阿发伯 2008-08-30
  • 打赏
  • 举报
回复
谢谢提醒,是应该加上这一句。因为文章的例子保存后能够正常使用,所以没有设置关闭标志
laviewpbt 2008-08-30
  • 打赏
  • 举报
回复
呵呵
那说明我的代码是没有问题了,其实我只是想证明下这个结论,真正坐图像处理我还是用自己的算法的,我也是组合了很多次都行。

另外一个问题,GDI+到现在为止的版本还是1.0吗,我知道1.0不可以将多帧图像保存为GIF格式的,希望现在有2.0了,并且能保存多帧GIF就好了。

顺便提一下,你的保存为多帧的TIFF的代码,最后最好还加一个类似于这样的代码吧

uEncParams.Parameter.value = VarPtr(EncoderValue.EncoderValueFlush)
GdipSaveAdd Image, uEncParams

就是这个EncoderValueFlush
我看MSDN上都是这样些的。
阿发伯 2008-08-30
  • 打赏
  • 举报
回复
ColorMatrixFlags和ColorAdjustType所有组合都用到了,还是你那个效果,上面的图是用扫描线自己处理的。
阿发伯 2008-08-30
  • 打赏
  • 举报
回复
确实有问题,这和函数调用没什么关系,应该是GDI+本身的BUG,你要求的是图像取反,好像有些像素反过头了,呵呵,正确的图像效果应该是下面这个样:
阿发伯 2008-08-30
  • 打赏
  • 举报
回复
好的,我用Delphi试一下
laviewpbt 2008-08-30
  • 打赏
  • 举报
回复
Public Declare Function GdipSetImageAttributesColorMatrix Lib "gdiplus" (ByVal ImgAttr As Long, ByVal clrAdjust As Long, ByVal clrAdjustEnabled As Long, ByRef clrMatrix As Any, ByRef grayMatrix As Any, ByVal clrMatrixFlags As Long) As Long

Public Enum ColorMatrixFlags
ColorMatrixFlagsDefault = 0
ColorMatrixFlagsSkipGrays = 1
ColorMatrixFlagsAltGray = 2
End Enum


这个是他的API函数声明,各个参数都很明了,clrMatrixFlags 不管设置为什么效果都不对,但是就是只针对这幅 图像,其他图像大部分都是正确的效果。你也试验下这个图像啊。
阿发伯 2008-08-30
  • 打赏
  • 举报
回复
从图的效果来看,是ColorMatrixFlags设置为ColorMatrixFlagsSkipGrays产生的,应该是ColorMatrixFlagsDefault。ColorMatrixFlagsSkipGrays只调整彩色而忽略灰度,当图像中存在灰度像素(就是R、G、B相等的像素)时就是你的效果图的想象,
阿发伯 2008-08-30
  • 打赏
  • 举报
回复
更正:不是为什么没有设置ColorAdjustType,而是为什么没有设置ColorMatrixFlags。
阿发伯 2008-08-30
  • 打赏
  • 举报
回复
GdipSetImageAttributesColorMatrix ImgAttr, ColorAdjustTypeBitmap, True, Matrix(0, 0), 0, 1
这一句有些不明白(VB的参数为啥不一样),为什么没有设置ColorAdjustType,下面是我文章里关于这个参数的说明(你把cfxxxx看成是ColorMatrixFlagsxxxx),如果不明白,干脆把ColorMatrixFlags和ColorAdjustType都设置为Default, 即 ColorMatrixFlagsDefault和ColorAdjustTypeDefault就行了:

mode参数是设置颜色矩阵方法中独有的参数类型,其定义如下:

TColorMatrixFlags = (cfDefault, cfSkipGrays, cfAltGray);

该枚举类型的运用不太好理解,对照SetColorMatrices方法,我们可以作如下分析:

假设把上面ColorMatrix单位矩阵中表示红色的ColorMatr[0,0]元素改为0,也就是去掉图像中的红色成分, 先让SetColorMatrices方法的colorMatrix和grayMatrix参数使用同一个矩阵。catype设置为缺省值ctDefault,然后设置mode参数:

1、mode=ctDefault时,用colorMatrix矩阵调整所有像素(包括灰度像素),grayMatrix在这里不起作用,效果见下图A;

2、mode=cfSkipGrays时,只用colorMatrix调整彩色像素,grayMatrix也不起作用,效果见下图B;

3、mode=cfAltGray时,colorMatrix和grayMatrix分别调整图像的彩色像素和灰度像素,因为colorMatrix和grayMatrix用的是同一个矩阵,彩色像素和灰度像素作了相同的调整,所以效果和下图A一样,我们把colorMatrix设置为单位矩阵,即只调整灰度像素,不调整彩色像素,其效果为下图C。从效果图,还可以看出一个现象,把B和C图上变换的部分合起来,刚好就是A图。

另一个方法SetColorMatrix没有灰度像素调整矩阵,所以只有前面2个枚举项有效,用上面的矩阵作参数后的效果与上图A、B一样,注意:cfAltGray在这里是非法的!


1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi GAME,图形处理/多媒体
社区管理员
  • GAME,图形处理/多媒体社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧