我估计是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我都试过,但是对于这幅图像就是不行。
请您有空能帮我诊断一下吗,谢谢。
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我都试过,但是对于这幅图像就是不行。
请您有空能帮我诊断一下吗,谢谢。
这一句有些不明白(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在这里是非法的!
ColorMatrixFlagsDefault = 0
ColorMatrixFlagsSkipGrays = 1
ColorMatrixFlagsAltGray = 2
End Enum
这个是他的API函数声明,各个参数都很明了,clrMatrixFlags 不管设置为什么效果都不对,但是就是只针对这幅 图像,其他图像大部分都是正确的效果。你也试验下这个图像啊。
那说明我的代码是没有问题了,其实我只是想证明下这个结论,真正坐图像处理我还是用自己的算法的,我也是组合了很多次都行。另外一个问题,GDI+到现在为止的版本还是1.0吗,我知道1.0不可以将多帧图像保存为GIF格式的,希望现在有2.0了,并且能保存多帧GIF就好了。顺便提一下,你的保存为多帧的TIFF的代码,最后最好还加一个类似于这样的代码吧
uEncParams.Parameter.value = VarPtr(EncoderValue.EncoderValueFlush)
GdipSaveAdd Image, uEncParams就是这个EncoderValueFlush
我看MSDN上都是这样些的。