首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

新手想用C写一个图片查看器,遇难了~help!解决方案

2012-05-21 
新手想用C写一个图片查看器,遇难了~~help!我想写一个只能查看BMP格式的图片文件查看器(BMP格式简单点),程

新手想用C写一个图片查看器,遇难了~~help!
我想写一个只能查看BMP格式的图片文件查看器(BMP格式简单点),程序的思路是这样的:
1,读取BMP文件,取得文件头,图片数据内容.
2,根据文件头的信息,(比如宽度,高度等),利用SetPixel函数一个一个点地画出图来.

可是出现了一些问题:
可以查看100*100左右的小位图文件,显示正常,但是当显示大一点的文件时,图像会出现徐徐的,而且色彩失真了,变得好像有点黑白,我都不知道怎么回事.
正常的图片查看器用C是怎么编写的呢??不用别的什么图形库,用原始的C写.

以下是我的代码:

  FILE *fp;
char buff[100];
char photoBuff[90000],*p,*prgb;
BITMAPFILEHEADER *hdr; //位图文件头
BITMAPINFOHEADER *info; //位图文件头信息
static RGBQUAD *rgbs; //存储图片数据
int i,j,index,error;
static int row,column; //图片的行列

switch (message)
{
case WM_CREATE:
fp = fopen("d:/1.bmp","rb");
fread(buff,1,sizeof(buff),fp);

hdr = (BITMAPFILEHEADER*)buff;
info = (BITMAPINFOHEADER*) (buff+sizeof(BITMAPFILEHEADER));

rgbs = (RGBQUAD*)malloc(sizeof(RGBQUAD)* (info->biHeight*info->biWidth));

fseek(fp,hdr->bfOffBits,SEEK_SET);
fread(photoBuff,1,sizeof(photoBuff),fp);
fclose(fp);

p = photoBuff;
prgb= (char*)rgbs;
error = (info->biHeight*info->biWidth);
for(i=0;i< error;i++){
*(prgb+i*4) = *p;
*(prgb+i*4+1) = *(p+1);
*(prgb+i*4+2) = *(p+2);
p+=3;
}
row = info->biHeight;
column= info->biWidth;

return 0;


case WM_PAINT:

hdc = BeginPaint (hwnd, &ps) ;
index =0;
for(i=0;i<row;i++){
for(j=0;j<column;j++,index++){
SetPixel(hdc,j+100,(row-i),RGB(rgbs[index].rgbRed, rgbs[index].rgbGreen , rgbs[index].rgbBlue));
}
}



EndPaint (hwnd, &ps) ;
return 0 ;

[解决办法]
BitBlt
[解决办法]

探讨

BitBlt

[解决办法]
HBRUSH
HDC
Bitblt
搜索一下!~
[解决办法]
探讨

谢谢大家,感觉大家一定没有看我的代码,换作我我也懒得看.
查了查这个bitblt,感觉还是没明白他原理,我程序只有一个HDC,源HDC没有,源数据就是来自文件的.

所以我觉得要实现画图,应该不是用SetPixel这个函数的,(这个函数调用太多了,一个像素就调用一次,大一点的图像我运行了也觉得有点卡),应该要用到微软提供的库什么的.就比如大家说的那个bitblt.
那微软的画图也是画了这……

[解决办法]
利用SetPixel函数一个一个点地画出图来.
..这个函数对大图像很慢的说

热点排行