用c语言如何读取和保存jpg图片文件?

用c语言如何读取和保存jpg图片文件?,第1张

#include <stdio.h>

#include <stdlib.h>

#include <windows.h>

int file_size(char* filename)//获取文件名为filename的文件大小。

{

FILE *fp = fopen(filename, "rb")//打开文件。

int size

if(fp == NULL) // 打开文件失败

return -1

fseek(fp, 0, SEEK_END)//定位文件指针到文件尾。

size=ftell(fp)//获取文件指针偏移量,即文件大小。

fclose(fp)//关闭文件。

return size

}

int main ()

{

int size=0

size=file_size("qw")

printf("%d\n",size)

FILE * pFile,*qw

char *buffer=(char*)malloc(sizeof(char)*size)

qw   =fopen("qw","r")

pFile = fopen ( "qwe" , "wb" )

printf("%d==\n",pFile)

printf("%d\n",size)

fread(buffer,1,size,qw)

fwrite (buffer , sizeof(byte), size , pFile )

fclose (pFile)

rename("qwe","Groot.jpg")

return 0

}

扩展资料:

c语言读取TXT文件:

#include <stdio.h>

#include <stdlib.h>

#include <string.h>

#define MAX_LINE 1024

int main()

{

char buf[MAX_LINE]  /*缓冲区*/

FILE *fp            /*文件指针*/

int len             /*行字符个数*/

if((fp = fopen("test.txt","r")) == NULL)

{

perror("fail to read")

exit (1)

}

while(fgets(buf,MAX_LINE,fp) != NULL)

{

len = strlen(buf)

buf[len-1] = '\0'  /*去掉换行符*/

printf("%s %d \n",buf,len - 1)

}

return 0

}

有这样一个二进制文件,大小在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

nf.Open(dstfile,CFile::modeCreate|CFile::modeWrite|CFile::typeBinary)

unsigned t=0,t1=0

nf.Write(&a,sizeof(char))

nf.Write(&b,sizeof(char))

while(1)

{

sfp->Read(&t,sizeof(char))

len++

nf.Write(&t,sizeof(char))

if(t==0xFF)

{

sfp->Read(&t1,sizeof(char))

len++

if(t1==0xD9)

break

else

nf.Write(&t1,sizeof(char))

}

}

nf.Close()

}

调用:

void test()

{

CFile fp

fp.Open("86b05621.jpg",CFile::modeRead|CFile::typeBinary)//文件名改一下

unsigned char a=0,b=0

len=0

while(1)

{

fp.Read(&a,sizeof(char))

len++

if(len>=fp.GetLength())

break

if(a==0xFF)

{

fp.Read(&b,sizeof(char))

len++

if(b==0xD8)

{

filesn++

char filename[256]

sprintf(filename,"Jpg %d.jpg",filesn)

ReadJpg(&fp,filename,a,b)

}

}

}

fp.Close()

}

思路是,先得到FF的值,然后再判断下一位是否是0xD8, 但这里要说明一下,如果你的其它数据信息里也含有FF D8值的话就会出错了, 所以为保险起见,应该再多比较几位, JPG的头是固定的,再往下就是EF E0 00 1E, 建议楼主再往下比较四位比较保险(在程序中稍作修改即可)

你是不是在 分析某个 游戏的或程序的资源文件呀,如果是的话,这个资源文件应该配有一个 索引文件!或在其文件自身。索引可以列表索引,链表形示……

如果是你自已生成的文件包,最好加上索引,因为这样可以提高效率!

可以直接读取的

按照二进制文件

也就是"rb"方式打开就可以了

不过

读取后,这个是乱的,没法直接显示。

需要自己写解码程序,或者调用对应jpeg库

转成bitmap才可以显示的。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12032783.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存