BMP位图文件有它的属性,我们如果不读取他的属性的话,无法对它的 *** 作,
所以BMP位图文件包括1位图文件头(记录位图文件的特征到真正图像数据的偏
移量文件大小等等信息)2位图信息头(记录的就是位图的大小,每个像素占的位
数,是否压缩等等信息)3调色板(如果位图信息头里面的每个像素的位数小于24
位,就需要调色板)4真正的位图数据
为什么产生误区我觉得真正的原因是你没有明白什么是文件
文件就是把一些数据组织起来,并保存它们
而正因为数据的组织不同,所以就构成了不同的文件类型
而文件的后缀名是文件被组织了后,人民为了区别它和其他文件格式的不同而自
己取的一个名字
比方说,我这个数据是按文本组织的。那么你不管把改为什么后缀名,它还是文本
文件
以后学文件的时候别看它的后缀名,而要看它的文件的存贮实质
人们开发出来的文件格式,都有他们不同的组织方式,不是说BMP有头信息,
人家一定都要有
有这样一个二进制文件,大小在100M左右,里面存放了多张JPG,文件格式如下:
无关数据区
JPG数据区
无关数据区
JPG数据区
无关数据区
JPG数据区
已知JPG起始标志为:“FF
D8
FF
E0
00
10
4A”,结束标志为:“FF
D9”。
现想把这些JPG数据从该文件中读出来,生成一个个单独的文件,该如何做呢?
帮你写了个程序,
测试了只含有一个信息的文件
int
len=0;
int
filesn=0;
void
ReadJpg(CFile
sfp,const
char
dstfile,unsigned
char
a,unsigned
char
b)
{
CFile
nf;
nfOpen(dstfile,CFile::modeCreate|CFile::modeWrite|CFile::typeBinary);
unsigned
t=0,t1=0;
nfWrite(&a,sizeof(char));
nfWrite(&b,sizeof(char));
while(1)
{
sfp->Read(&t,sizeof(char));
len++;
nfWrite(&t,sizeof(char));
if(t==0xFF)
{
sfp->Read(&t1,sizeof(char));
len++;
if(t1==0xD9)
break;
else
nfWrite(&t1,sizeof(char));
}
}
nfClose();
}
调用:
void
test()
{
CFile
fp;
fpOpen("86b05621jpg",CFile::modeRead|CFile::typeBinary);//文件名改一下
unsigned
char
a=0,b=0;
len=0;
while(1)
{
fpRead(&a,sizeof(char));
len++;
if(len>=fpGetLength())
break;
if(a==0xFF)
{
fpRead(&b,sizeof(char));
len++;
if(b==0xD8)
{
filesn++;
char
filename[256];
sprintf(filename,"Jpg
%djpg",filesn);
ReadJpg(&fp,filename,a,b);
}
}
}
fpClose();
}
思路是,先得到FF的值,然后再判断下一位是否是0xD8,
但这里要说明一下,如果你的其它数据信息里也含有FF
D8值的话就会出错了,
所以为保险起见,应该再多比较几位,
JPG的头是固定的,再往下就是EF
E0
00
1E,
建议楼主再往下比较四位比较保险(在程序中稍作修改即可)
你是不是在
分析某个
游戏的或程序的资源文件呀,如果是的话,这个资源文件应该配有一个
索引文件!或在其文件自身。索引可以列表索引,链表形示……
如果是你自已生成的文件包,最好加上索引,因为这样可以提高效率!
Image im = ImageFromFile("c:\\SP_A0198jpg");
MessageBoxShow("长:" + imSizeHeightToString());
MessageBoxShow("宽:"+ imSizeWidthToString());
以上就是关于C语言读写图片文件问题全部的内容,包括:C语言读写图片文件问题、用c语言如何读取和保存jpg图片文件、c# 获取图片属性等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)