如何解决使用BitBlt无法正确显示图像
所以我昨天才刚开始c。尽我所能,我尝试了一个相当简单的任务,即在桌面上显示图像。首先,我尝试使用像素:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main() {
int a;
int b;
int x = 0;
COLORREF clr = RGB(200,100,30);
HDC dc = GetDC(NULL);
while (x != 1){
for (a=0; a<20; a++){
for (b=0; b<20; b++){
SetPixel(dc,b,a,clr);
}
}
}
return 0;
}
成功了。现在,我尝试对整个图像进行处理,但失败了:
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
int main() {
int x = 0;
HBITMAP hBitmap = (HBITMAP)LoadImage(NULL,"neco.bmp",IMAGE_BITMAP,487,456,LR_LOADFROMFILE);
HDC dc = GetDC(NULL);
while (x != 1){
BitBlt(dc,hBitmap,SRCPAINT);
}
return 0;
}
我假设它读取图像就像使用BLACKNESS
作为BitBlt
的最后一个参数一样,它确实显示具有给定尺寸的黑色矩形。但通常情况下不会发生其他任何事情。此外,脚本可以编译而不会引起任何错误。
解决方法
BitBlt(dc,487,456,Bitmap,SRCPAINT);
在这一行,您尝试将位图句柄传递给设备上下文句柄参数。
请注意,BitBlt
将位从一个设备上下文传输到另一个设备上下文。您将为位图创建另一个设备上下文,在其中选择位图,然后执行所需的操作。例如:
#include <windows.h>
int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
{
HBITMAP hBitmap = (HBITMAP)LoadImage(NULL,"neco.bmp",IMAGE_BITMAP,LR_LOADFROMFILE);
HDC hDC = GetDC(NULL);
HDC hBitmapDC = CreateCompatibleDC(hDC);
HBITMAP hOldBitmap = (HBITMAP)SelectObject(hBitmapDC,hBitmap);
BitBlt(hDC,hBitmapDC,SRCCOPY);
/* Don't forget to release resources that you've acquired */
SelectObject(hBitmapDC,hOldBitmap)
DeleteObject(hBitmap);
DeleteDC(hBitmapDC);
ReleaseDC(HWND_DESKTOP,hDC);
return 0;
}
编辑:感谢@IInspectable纠正了有关GDI资源释放的问题。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。