'转换成灰色 For i = nx To nWidth For j = ny To nHeight 'Call ChangetoGray function ChangetoGray hdc, i, j, nMaskColor Next j Next i End Sub
Private Declare Function SetPixelV Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Long Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
http://www.54uc.com/phppost9/php71190.htm直接显示灰度图
http://www.study888.com/computer/pro/vb/jiqiao/200505/34183.html
转化为灰度图就是把R,G,B三个分量相加,再取平均值设为新的RGB值;
取得RGB值有两种方法:一种是GetPixel,速度较慢;另一种是用GetBitmapBits等相应函数获取,速度较快,但编码有些麻烦.
' 入口: SrcDC 指定的颜色, nx场景中点的X ,ny 场景中点的Y,nMaskColor [可选],该颜色不会改变Private Sub ChangetoGray(ByVal SrcDC&, ByVal nx&, ByVal ny&, Optional ByVal nMaskColor& = -1)
Dim rgbColor&, Gray&
Dim RValue&, GValue&, BValue&
Dim dl&
rgbColor = GetPixel(SrcDC, nx, ny)
'如果rgbColor=MaskColor,则不改变颜色
If rgbColor = nMaskColor Then GoTo Release:
'获取颜色分量
RValue = GetRValue(rgbColor)
GValue = GetGValue(rgbColor)
BValue = GetBValue(rgbColor)
'重新设置颜色
Gray = (9798 * RValue + 19235 * GValue + 3735 * BValue) / 32768 'Change wffs
rgbColor = RGB(Gray, Gray, Gray)
dl& = SetPixelV(SrcDC, nx, ny, rgbColor)
Release:
rgbColor = 0: Gray = 0
RValue = 0: GValue = 0: BValue = 0
dl = 0
End Sub' 函数: DrawGrayBitmap 功能: 将DC中的某一区域转换为灰度表示
' 入口: hdc DC,nx 区域的起始点X,ny 区域的起始点Y,nWidth 区域的宽度
' nHeight 区域的高度,nMaskColor 屏蔽色Private Sub DrawGrayBitmap(ByVal hdc&, ByVal nx&, ByVal ny&, ByVal nWidth&, ByVal nHeight&, Optional ByVal nMaskColor& = -1)
Dim i&, j&
'转换成灰色
For i = nx To nWidth
For j = ny To nHeight
'Call ChangetoGray function
ChangetoGray hdc, i, j, nMaskColor
Next j
Next i
End Sub
Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
取每点的RGB值,把三个分量相加再除以3,得到的数值作为新的三个分量的值,再写回去。
=====================================
呵呵,兄台象我一样,懒人一个。
rgb相加再除3的方法是简单方便,但出来的灰度图会很难看的。
要效果好一点的,用上面的 Gray = (9798 * RValue + 19235 * GValue + 3735 * BValue) / 32768 公式吧。
至于具体方法,按速度要求选择吧。
用PSet或SetPixelV都很慢
建议用GetDIBits取得图像数据我以前写的用VB作DIB图像处理的文章(其中的连接早已失效):
http://dev.csdn.net/develop/article/20/20442.shtmWallesCai(曾经沧海难为水,除却巫山不是云。此情可待成追忆,只是当时已惘然。)也写过几个例子:
http://blog.csdn.net/WallesCai/
彩色转灰度的心理公式
Gray = R*0.299 + G*0.587 + B*0.114但是该公式用的是浮点运算,一般化为整数运算,如楼上的
Gray = (9798 * RValue + 19235 * GValue + 3735 * BValue) / 32768
同意 zyl910(910:分儿,我又来了!)的观点,使用DIB方法,可以提高N倍速度