社区
C语言
帖子详情
文件的读取问题
jinjiajie
2006-03-01 10:50:32
我写了一个读取bmp图片的程序,但是24位的图像都会在读几个字节后就read不出来了,read函数的返回值为-1,为什么会出现这种情况的?有什么办法能解决吗?
...全文
121
7
打赏
收藏
文件的读取问题
我写了一个读取bmp图片的程序,但是24位的图像都会在读几个字节后就read不出来了,read函数的返回值为-1,为什么会出现这种情况的?有什么办法能解决吗?
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
7 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
jinjiajie
2006-03-01
打赏
举报
回复
....调了2天了,就是有几张图会莫名其妙的读不出来了,能给点可能的原因我好找
yajyjy
2006-03-01
打赏
举报
回复
注意文件指针
多做调试,跟踪读文件过程
jinjiajie
2006-03-01
打赏
举报
回复
int showbmp(HWND hWnd)
{
HDC hTuxiang;
int fp;
int size;
int size1;
char *headerbuffer;
char *rgbgurdbuffer;
int DataSizePerLine;
unsigned char byte;
unsigned char byte1;
unsigned char byte2;
RGBQUAD1 rgbb;
int a;
BITMAPFILEHEADER bmfheader;
BITMAPINFOHEADER bmiheader;
hTuxiang=GetDC(hWnd);
if((fp=open("Winter.bmp",O_RDONLY&O_TEXT)) == -1)
{
exit(0);
}
size=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);
headerbuffer=(char *)malloc(size);
read(fp,headerbuffer,size);
//文件头读取
bmfheader=*(BITMAPFILEHEADER *)headerbuffer;
bmiheader=*(BITMAPINFOHEADER *)(headerbuffer+sizeof(BITMAPFILEHEADER));
DataSizePerLine=((bmiheader.biWidth)* (bmiheader.biBitCount)+31)/8/4*4;
//数据部分处理
switch(bmiheader.biBitCount)
{
case 1:
RGBQUAD rgb2[2];
unsigned char byte21;
unsigned char byte22;
unsigned char byte23;
unsigned char byte24;
unsigned char byte25;
unsigned char byte26;
unsigned char byte27;
unsigned char byte28;
size1=2*sizeof(RGBQUAD);
rgbgurdbuffer=(char *)malloc(size1);
read(fp,rgbgurdbuffer,size1);
for(int i=0;i<2;i++)
{
rgb2[i]=*(RGBQUAD *)(rgbgurdbuffer+(i)*sizeof(RGBQUAD));
}
lseek(fp,bmfheader.bfOffBits,SEEK_SET);
for(int y=0;y<bmiheader.biHeight;y++)
{
for(i=0;i<DataSizePerLine;i++)
{
if((a=read(fp,&byte,1))>0)
{
byte21=(byte>>7)&0x1;
byte22=(byte>>6)&0x1;
byte23=(byte>>5)&0x1;
byte24=(byte>>4)&0x1;
byte25=(byte>>3)&0x1;
byte26=(byte>>2)&0x1;
byte27=(byte>>1)&0x1;
byte28=(byte)&0x1;
SetPixel(hTuxiang,100+8*i,600-y, RGB(rgb2[byte21].rgbRed,rgb2[byte21].rgbGreen, rgb2[byte21].rgbBlue));
SetPixel(hTuxiang,100+8*i+1,600-y, RGB(rgb2[byte22].rgbRed,rgb2[byte22].rgbGreen, rgb2[byte22].rgbBlue));
SetPixel(hTuxiang,100+8*i+2,600-y, RGB(rgb2[byte23].rgbRed,rgb2[byte23].rgbGreen, rgb2[byte23].rgbBlue));
SetPixel(hTuxiang,100+8*i+3,600-y, RGB(rgb2[byte24].rgbRed,rgb2[byte24].rgbGreen, rgb2[byte24].rgbBlue));
SetPixel(hTuxiang,100+8*i+4,600-y, RGB(rgb2[byte25].rgbRed,rgb2[byte25].rgbGreen, rgb2[byte25].rgbBlue));
SetPixel(hTuxiang,100+8*i+5,600-y, RGB(rgb2[byte26].rgbRed,rgb2[byte26].rgbGreen, rgb2[byte26].rgbBlue));
SetPixel(hTuxiang,100+8*i+6,600-y, RGB(rgb2[byte27].rgbRed,rgb2[byte27].rgbGreen, rgb2[byte27].rgbBlue));
SetPixel(hTuxiang,100+8*i+7,600-y, RGB(rgb2[byte28].rgbRed,rgb2[byte28].rgbGreen, rgb2[byte28].rgbBlue));
}else if(a==0)
{
}else{
exit(0);
}
}
}
break;
case 4:
RGBQUAD rgb16[16];
size1=16*sizeof(RGBQUAD);
rgbgurdbuffer=(char *)malloc(size1);
read(fp,rgbgurdbuffer,size1);
for(int i=0;i<16;i++)
{
rgb16[i]=*(RGBQUAD *)(rgbgurdbuffer+(i)*sizeof(RGBQUAD));
}
lseek(fp,bmfheader.bfOffBits,SEEK_SET);
for(int y=0;y<bmiheader.biHeight;y++)
{
for(i=0;i<DataSizePerLine;i++)
{
if((a=read(fp,&byte,1))>0)
{
byte1=byte&0xf;
byte2=(byte>>4)&0xf;
SetPixel(hTuxiang,100+2*i,600-y, RGB(rgb16[byte1].rgbRed,rgb16[byte1].rgbGreen, rgb16[byte1].rgbBlue));
SetPixel(hTuxiang,100+2*i+1,600-y, RGB(rgb16[byte2].rgbRed,rgb16[byte2].rgbGreen, rgb16[byte2].rgbBlue));
}else if(a==0)
{
}else{
exit(0);
}
}
}
break;
case 8:
RGBQUAD rgb256[256];
size1=256*sizeof(RGBQUAD);
rgbgurdbuffer=(char *)malloc(size1);
read(fp,rgbgurdbuffer,size1);
for(int i=0;i<256;i++)
{
rgb256[i]=*(RGBQUAD *)(rgbgurdbuffer+(i)*sizeof(RGBQUAD));
}
lseek(fp,bmfheader.bfOffBits,SEEK_SET);
for(int y=0;y<bmiheader.biHeight;y++)
{
for(i=0;i<DataSizePerLine;i++)
{
if(a=read(fp,&byte,1)>0)
{
SetPixel(hTuxiang,100+i,600-y, RGB(rgb256[byte].rgbRed,rgb256[byte].rgbGreen, rgb256[byte].rgbBlue));
}else if(a==0)
{
}else{
exit(0);
}
}
}
break;
case 24:
//lseek(fp,bmfheader.bfOffBits,SEEK_SET);
for(int y=0;y<bmiheader.biHeight;y++)
{
for(i=0;i<DataSizePerLine;i=i+3)
{
if(a=read(fp,&rgbb,sizeof(RGBQUAD1))>0)
/*read(fp,&byte1,sizeof(char));
read(fp,&byte2,sizeof(char));*/
SetPixel(hTuxiang,100+i/3,600-y, RGB(rgbb.rgbRED,rgbb.rgbGREEN,rgbb.rgbBLUE));
else if(a==0){
}else{
lseek(fp,3,SEEK_END);
}
}
}
break;
default :
exit(0);
}
//rgb=*(RGBQUAD *)(headerbuffer+sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER));
//bmiheader.biBitCount;
if(bmiheader.biBitCount==1 ||bmiheader.biBitCount==4 ||bmiheader.biBitCount==8)
free(rgbgurdbuffer);
free(headerbuffer);
close(fp);
if(ReleaseDC(hWnd,hTuxiang )==0)
{
exit(0);
}
return 1;
}
现在的情况是有几张2位的图读一半就认为结束了,24位的图转为16位后然后转成24位的能显示,不转过就显示100多个像素后救停了...纳闷中
逸学堂
2006-03-01
打赏
举报
回复
用文本方式读取。
最好贴出代码
屋顶上的老猫
2006-03-01
打赏
举报
回复
http://community.csdn.net/Expert/topic/4386/4386898.xml?temp=.4813959
jinjiajie
2006-03-01
打赏
举报
回复
o ,搞错了,是一个文件明明很大,但是却很快就说读尾了....这个是怎么回事情啊?有人能帮我分析下吗?
jinjiajie
2006-03-01
打赏
举报
回复
哎...头大了,没人和我一样遇到类似情况的吗?
Android
读取
文本
文件
的demo
在Android开发中,
读取
文本
文件
是常见的任务,特别是在创建应用程序需要展示或处理文本数据时。这个"Android
读取
文本
文件
的demo"就是一个很好的学习示例,它演示了如何从res/raw目录下
读取
txt
文件
并将其内容显示在...
读取
xls和xlsxjar包
在Java编程中,处理Excel
文件
是一项常见的任务,无论是
读取
数据、写入数据还是进行复杂的分析。Excel有不同版本,最常见的是xls(Excel 97-2003格式)和xlsx(Excel 2007及以上版本的OpenXML格式)。这两种格式的...
rddata.m -- MIT-BIH ECG 信号的数据
读取
Matlab程序
MIT-BIH ECG 信号的数据
读取
Matlab程序,能够
读取
MIT-BIH数据库 .atr、.dat、.hea三种
文件
的数据,根据这些数据计算出实际的心电信号值,并绘制出信号波形。
读取
某人的消息列表
在IT行业中,"
读取
某人的消息列表"这个任务通常涉及到数据存储、用户授权和接口设计等关键知识点。以下是对这些技术领域的详细说明: 1. 数据存储:在实现消息列表的
读取
功能时,首先需要一个可靠的数据存储系统。...
读和写注册表
文件
的例子
理解如何
读取
和写入注册表
文件
对于系统管理员、开发者以及高级用户来说都是非常重要的技能。下面,我们将通过一个名为"Registry Editor"的简单示例程序来深入探讨这一概念。 **标题解析:** "读和写注册表
文件
的...
C语言
70,026
社区成员
243,244
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章