
BOOL BitBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, DWORD dwRop )
返回值:函数成功,返回非零值,否则为0。
参数:
x
指定目标矩形左上角的逻辑x坐标。
y
指定目标矩形左上角的逻辑y坐标。
nWidth
指定目标矩形和源位图的宽度(逻辑单位)。
nHeight
指定目标矩形和源位图的高度(逻辑单位)。
pSrcDC
指向CDC对象的指针,标识待拷贝位图的设备上下文。如果dwRop指定不包括源的光栅 *** 作,则它必须为NULL。
xSrc
指定源位图左上角的逻辑X坐标。
ySrc
指定源位图左上角的逻辑Y坐标。
dwRop
指定要执行的光栅 *** 作。光栅 *** 作代码定义GDC如何合并输出 *** 作中的颜色,包括当前画刷、可能的源位图和目标位图。下面对dwRop列出光栅 *** 作代码及其描述:BLACKNESS
所有输出变黑。
DSTINVERT
反转目标位图。
MERGECOPY
使用布尔AND *** 作符合并特征与源位图。
MERGEPAINT
使用布尔OR *** 作符合并特征与源位图。
NOTSRCCOPY
拷贝反转源位图到目标。
NOTSRCERASE
反转使用布尔OR *** 作符合并源和目标位图的结果。
PATCOPY
拷贝特征到目标位图。
PATINVERT
使用布尔XOR *** 作符合并目标位图和特征。
PATPAINT
使用布尔OR *** 作符合并反转源位图和特征。用布尔OR *** 作符合并这项 *** 作结果与目标位图。
SRCAND
使用布尔AND *** 作符合并目标像素和源位图。
SRCCOPY
拷贝源位图到目标位图。
SRCERASE
反转目标位图并用布尔AND *** 作符合并这个结果和源位图。
SRCINVERT
使用布尔XOR *** 作符合并目标像素和源位图。
SRCPAINT
使用布尔OR *** 作符合并目标像素和源位图。
WHITENESS
所有输出变白。 有关光栅 *** 作代码的完整列表,请参阅联机文档“Win32 SDK程序员参考”附录节中的“关于光栅 *** 作代码”。
说明:
从源设备上下文拷贝位图到这个当前设备上下文。
应用可以在字节边界上对齐窗口或客户区域,保证BitBlt *** 作发生在以字节对齐的矩形上(登记窗口类时设置设备CS_BYTEALLGNWINDOW或CS_BYTEALIGHCLIENT标记)。
在字节对齐矩形上的BitBlt *** 作比未经字节对齐的矩形上的BitBlt *** 作快许多。如果想对自己的设备上下文指定字节对齐类风格,必须登记窗口类而不要依赖Microsoft基本类。可使用全局函数AfxRegisterWndClass。
一旦使用目标设备上下文和使用源设备上下文,GDI变形nWidth和nHeight。如果结果延伸不匹配,必要时GDI使用Windows StretchBlt函数压缩或拉伸源位图。
如果目标、源和特征位图颜色格式不同,BitBlt转换源和特征位图以匹配目标。转换中使用目标位图的前景和背景色。
BitBlt函数把单色位图转换为彩色时,它设置白色(1)为背景色,黑色(0)作为前景色。使用目标设备上下文的背景和前景色。要把彩色转换为单色,BitBlt把与背景色匹配的像素设置为白色,其余所有像素设置为黑色。在从彩色到单色的转换中,BitBlt使用彩色设备上下文的前景和背景色。
注意,并非所有的设备上下文都支持BitBlt。为检查给定设备上下文是否支持BitBlt,使用GetDeviceCaps成员函数并指定RASTERCAPS索引。
直接给你写个vc6 256色 位图资源 无错的例子,你的问题是一些变量要用staticHINSTANCE你该考虑全局变量(把winmain的参数传给全局变量) 或者 getwindowlong 来得到
防连接被屏,只要写成这样了
pan
@
baidu
@
com
#
s
#
1mgLwxSW
我不是太明确你第一个问题的意思。我的理解是你要对屏幕的某个目标进行取色。问题是如何确认这个目标的位置。如果目标是固定的坐标或者在固定的屏幕比例中出现,那么直接针对的计算坐标来取色即可。但我想你希望的是对一个不固定的坐标取色。那么多半是窗口坐标,这样的话可以获取窗口的DC来取色。总的来说,你必须确立一个参照坐标。2,出错是因为并不是所有DC都支持GetPixel 和 SetPixel。例如win7的很多窗体,Java程序的窗体。不过DirectX的窗体好像是可以的。因为这个原因,考虑到兼容性需要,我往往是使用BitBlt来对一个像素点截屏再进行取色。一般来说BitBlt 不会让效率降低太多。可能几十倍而已,几千几百个点的话可以忽略。如果你是对大范围取色,BitBlt会比GetPixel更有效率。
3.读取jpg需要使用一些解码包会比较好,因为jpg的结构相当复杂,自己写代码会非常费事,事实上,我对JPG的结构还挺熟悉,但从来不敢想象自己写一个关于他的解压包。如果你是懒得找包的话,给你一个不太好的但可以处理的办法:使用JNI(Java native interface),他可以用作java 和c之间的界面, 由jdk自带。你可以在C里调度Java。java的 ImageIO.read(File file)方程可以直接读取bmp gif jpg 和 png 文件。读出来的BufferedImage 可以直接获取像素资料,但是效率不高,你可以从BufferedImage对象中获取 WritableRaster,然后获取DataBuffer 最后是直接的 byte 或者 int 数组数据。但是,前提是你要会JNI,同时JNI在C中调度Java的代码也是非常糟糕的,代码效率还可以,但代码会极度难看。如果真的决定使用JNI,那我建议你先用Java写一个 byte[] readJPG(String path)的方程然后再C调度这个方程获取 byte 数组,而不是直接从C调用ImageIO.read(),这样会省事非常多
但还是建议找C的解码包。给代码是不可能的,我原意话10分钟来回答问题,但不太原意话1小时来写代码。而且自己寻找答案会获得和学习更多。
最后如果你想要做的是图像识别,可以说jpg图片不是很好的选择,因为那是一种会丢失数据的文件格式,你用点对点的精确识别方法肯定(99.9999%)不能识别出图片。用模糊识别是要有很好的技术知识同时效率也会降低。建议使用BMP作为识别图片。BMP的解码包和源码网上一大堆。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)