纯C读取24位图并且绘画在桌面

本文介绍了一个简单的C程序,该程序用于读取24位彩色位图文件,并将其像素数据直接绘制到Windows桌面窗口中进行显示。程序首先打开指定的位图文件,读取文件头和信息头,然后根据位图信息读取像素数据,并使用Windows API的SetPixel函数将像素绘制到屏幕上。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#include <Windows.h>
#include <stdio.h>
typedef struct{
BYTE b;
BYTE g;
BYTE r;
}RGB;
int main( void )
{
BITMAPFILEHEADER fileHeader;
BITMAPINFOHEADER infoHeader;
FILE* pfin = fopen("5.bmp","rb");
if(!pfin)
{
printf("打开文件失败\n");
getchar();
return 0;
}
fread(&fileHeader,sizeof(BITMAPFILEHEADER),1,pfin);
fread(&infoHeader,sizeof(BITMAPINFO),1,pfin);
//为简化代码,只处理24位彩色
if( infoHeader.biBitCount == 24 )
{
int size = infoHeader.biWidth*infoHeader.biHeight;
RGB* img = new RGB[size];
const int smh =  ((((infoHeader.biWidth * infoHeader.biBitCount) + 31) & ~31) / 8); //扫描行 字节数  也就是一行数据所需要的字节数 Windows规定一个扫描行所占的字节数必须是4的倍数(即以long为单位),不足的以0填充
for(int i = 0; i < infoHeader.biHeight ;++i)
{
fseek(pfin, fileHeader.bfOffBits + i * smh, SEEK_SET);
fread(img + i * infoHeader.biWidth, sizeof(RGB) , size , pfin );
}
{
HWND hwnd = GetDesktopWindow();
HDC hdc = GetDC(hwnd);
COLORREF color;
int x,y;
while(true)
{
for(int i = 0; i < size; ++i)
{
color = RGB(img[i].r, img[i].g, img[i].b);
x = (i + 1)%infoHeader.biWidth - 1; //扫描从左到右 
y = infoHeader.biHeight - (i + 1)/infoHeader.biWidth - 1; //扫描从下到上
if(color != RGB(255, 255, 255)) //白色不画 类似于透明图
SetPixel(hdc, x + 500, y + 500, color);
}
Sleep(100);
}
//释放句柄DC
ReleaseDC(hwnd, hdc);
}
delete[] img;
}
fclose(pfin);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值