怎样才能实现将图形文件中的每一点像素的RGB转换为单色灰度数据。实现将彩色图形转化成单色图形进行显示。
解决方案 »
- 100分!Excel中,用vba打开ppt,搜索ppt的内容,要可执行代码
- 有没有FOR VB 水晶报表的书或是电子文档啊
- BMP图片怎么以字符形式传送?
- mshflexgrid行颜色显示问题
- 请老鸟们帮个忙,数据操作时实时错误3021
- vbs怎么用循环给多个text控件赋值
- @@简单问题,立刻给分!@@
- 做一个软件,ie弹框怎么实现自动点击确定?
- 请教具体方法,用VB连接ACCESS数据库,谢谢。
- 有那位大哥大姐有在vb中播放gif动画的控件,要可以自由使用的,没什么注册提示
- 急问!!!如何在源程序中加入代码,使程序能开机自动运行(XP系统)! 100分!!
- 关于程序中内嵌html页面的问题
http://search.csdn.net/Expert/topic/574/574322.xml?temp=.5454218
声明
Public Declare Function SetPixel Lib "gdi32" Alias "SetPixel" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Long返回值
Long,指定点的实际RGB颜色。如设备不支持指定的准确颜色,则返回的值会与crColor有所不同。如指定的点不能设置,则会返回-1(例如,指定的点可能位于设备场景剪切区外面)。会设置GetLastError参数
hdc ------------ Long,设备场景的句柄
x,y ------------ Long,要设置的点,用逻辑坐标表示
crColor -------- Long,指定像素的新RGB颜色
主要是 Gray = (9798 * RValue + 19235 * GValue + 3735 * BValue) / 32768 'Change wffs
下面的是用setpixel写的,速度比较慢,有兴趣自己用DIB写。不过网上有很多现成的。Option Explicit
Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long) As Long
Private Declare Function SetPixelV Lib "gdi32" (ByVal hdc As Long, ByVal x As Long, ByVal y As Long, ByVal crColor As Long) As Long'从指定颜色中分离出红色分量
Function GetRValue&(ByVal rgbColor&)
GetRValue = rgbColor And &HFF
End Function'从指定颜色中分离出绿色分量
Function GetGValue&(ByVal rgbColor&)
GetGValue = (rgbColor And &HFF00&) / &HFF&
End Function'从指定颜色中分离出蓝色分量
Function GetBValue&(ByVal rgbColor&)
GetBValue = (rgbColor& And &HFF0000) / &HFF00&
End Function'将场景的某一点的颜色转换为灰色
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)
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
'将DC中的某一区域转换为灰度表示
'
'hdc DC
'nx 区域的起始点X
'ny 区域的起始点Y
'nWidth 区域的宽度
'nHeight 区域的高度
'nMaskColor 屏蔽色
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
ChangetoGray hdc, i, j, nMaskColor
Next j
Next i
End Sub
Private Sub cmdChange_Click()
DrawGrayBitmap picSrc.hdc, 0, 0, 258, 194
End SubPrivate Sub cmdRestore_Click()
picSrc.Cls
End SubPrivate Sub Form_Load()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 LongPrivate Sub Command1_Click()
Dim m, n As Single
For m = 0 To Me.Picture1.ScaleWidth
For n = 0 To Me.Picture1.ScaleHeight
SetPixelV Me.Picture1.hdc, m, n, &H808080 '或用RGB(r,g,b)
Next
Next
End Sub
Private Declare Function SetDIBits Lib "gdi32" (ByVal hdc As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As BITMAPINFO, ByVal wUsage As Long) As Long用GetDIBits读取图象数据,然后处理,再用SetDIBits显示处理后的图象,速度会比上面的方法快几十倍。
这是一个G值优先的灰度转换,其实用不着公式,灰度图说白了就RGB三个分量值相等的位图,所以只有256级;
实际上,按上面公式,你可任意取常数值进行转换,只要保证RGB三个分量常数值之和为32768就行了,不过有一种最快的转灰度算法,就是直接取一个分量值(一般取G值),将另两个改为与它相等,就可完成转换。
不过,这种算法有一些缺陷,就是对一些偏色图会出问题,比如:若是偏粉红色的图片,取G值转灰度,就会得到一张很暗(甚至全黑)的灰度图。若处理图片并用于保存,建议采用DIB处理,若只是用于屏幕显示,最好采用DDB处理,会快一些。setpixel与getpixel最好不要用,实在太慢,没有实用价值。