首页 > 编程知识 正文

c语言提取图片,c语言图片读取

时间:2024-03-25 09:50:01 阅读:332667 作者:CYFJ

本文目录一览:

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

#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("%dn",size);

FILE * pFile,*qw;

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

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

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

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

printf("%dn",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] = '';  /*去掉换行符*/

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

}

return 0;

}

C语言如何读取jpg格式的图片

有这样一个二进制文件,大小在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, 建议楼主再往下比较四位比较保险(在程序中稍作修改即可)

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

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

c语言,怎样读取一个BMP图片?

#ifndef IMAGE_H

#define IMAGE_H

void image_info(FILE* file);

void image_save(FILE *file);

void image_gray();

void image_binarization();

void image_opposite();

void image_channel(); //抽取RGB通道

void image_bright();//改变图像亮度

typedef struct BMP

{

//14字节

unsigned short bfType; //文件标识 2字节 必须为BM

unsigned int bfSize; //文件大小 4字节

unsigned short bfReserved1; //保留,每字节以"00"填写 2字节

unsigned short bfReserved2; //同上 2字节

unsigned int bfOffBits; //记录图像数据区的起始位置(图象数据相对于文件头字节的偏移量)。 4字节

//40字节

unsigned int biSize; //表示本结构的大小 4字节

int biWidth; //位图的宽度 4字节

int biHeight; //位图的高度 4字节

unsigned short biPlanes; //永远为1 , 2字节

unsigned short biBitCount; //位图的位数 分为1 4 8 16 24 32 2字节

unsigned int biCompression; //压缩说明 4字节

unsigned int biSizeImage; //表示位图数据区域的大小以字节为单位 4字节

int biXPelsPerMeter; //用象素/米表示的水平分辨率 4字节

int biYPelsPerMeter; //用象素/米表示的垂直分辨率 4字节

unsigned int biClrUsed; //位图使用的颜色索引数 4字节

unsigned int biClrImportant; //对图象显示有重要影响的颜色索引的数目 4字节

} BMP;

int line_byte;

unsigned char *imagedata;

extern BMP bmp;

extern int line_byte;

extern unsigned char *imagedata;

#endif

//image_rw.c文件

#includestdio.h

#includestdlib.h

#include"image.h"

void image_info(FILE *file)

{

int times=3; //输入文件名次数。

char bmp_name[10]; //文件名

printf("nplease enter a file name for reading:");

do

{

if (times3)

{

printf("nplease enter a file name for reading again:");

}

fflush(stdin);

gets(bmp_name);

//printf("n%s",bmp_name);

file=fopen(bmp_name,"rb+"); //打开一个文件进行读写操作。

--times;

if (file==NULL)

{

printf("nerror opening %s for reading! ",bmp_name);

}

else

{

break;

}

}

while(times!=0);

if (times==0)

{

printf("nsorry, shutdown!");

exit(1);

}

//读取图像信息

fseek(file,0L,0); //读取图像文件类型

fread(bmp,sizeof(BMP),1,file);

printf("n bmp tpye: %u",bmp.bfType);

printf("n bmp size: %u",bmp.bfSize);

printf("n bmp reserved1: %u",bmp.bfReserved1);

printf("n bmp reserved2: %u",bmp.bfReserved2);

printf("n bmp offBits: %u",bmp.bfOffBits);

printf("n bmp bisize: %u",bmp.biSize);

printf("n bmp biWidth: %d",bmp.biWidth);

printf("n bmp biHeight: %d",bmp.biHeight);

printf("n bmp biplans: %u",bmp.biPlanes);

printf("n bmp biBitCount: %u",bmp.biBitCount);

printf("n bmp biCompression: %u",bmp.biCompression);

printf("n bmp biSizeImage: %u",bmp.biSizeImage);

printf("n bmp biXPelsPerMeter: %d",bmp.biXPelsPerMeter);

printf("n bmp biYPelsPerMeter: %d",bmp.biYPelsPerMeter);

printf("n bmp biClrUsed: %u",bmp.biClrUsed);

printf("n bmp biClrImportant: %un",bmp.biClrImportant);

line_byte=(bmp.biWidth*bmp.biBitCount/8+3)/4*4; //获得图像数据每行的数据个数

//printf("dfsa%u",bmp.line_byte);

//bmp.imagedata=NULL;

imagedata=(unsigned char*)malloc(bmp.biSizeImage);

fseek(file,(long)bmp.bfOffBits,0);

fread(imagedata,sizeof(unsigned char),bmp.biSizeImage,file);

fclose(file);

}

//保存图像

void image_save(FILE *file)

{

int times=3; //输入文件名次数。

char bmp_name[10]; //文件名

//int i; //记录数据区个数

printf("nplease enter a file name for writeing:");

do

{

if (times3)

{

printf("nplease enter a file name for writeing again:");

}

fflush(stdin);

gets(bmp_name);

printf("n%s",bmp_name);

file=fopen(bmp_name,"wb+"); //打开一个文件进行读写操作。

--times;

if (file==NULL)

{

printf("nerror opening %s for writing",bmp_name);

}

else

{

break;

}

}

while(times!=0);

if (times==0)

{

printf("nsorry, shutdown!");

exit(1);

}

//写文件头

printf("n%s",bmp_name);

fseek(file,0L,0); //图像文件类型

fwrite((bmp.bfType),sizeof(short),1,file);

printf("n bmp tpye: %d",bmp.bfType);

fseek(file,2L,0); //图像文件大小

fwrite((bmp.bfSize),sizeof(int),1,file);

printf("n bmp size: %d",bmp.bfSize);

fseek(file,6L,0); //图像文件保留字1

fwrite((bmp.bfReserved1),sizeof(short),1,file);

printf("n bmp reserved1: %d",bmp.bfReserved1);

fseek(file,8L,0); //图像文件保留字2

fwrite((bmp.bfReserved2),sizeof(short),1,file);

printf("n bmp reserved2: %d",bmp.bfReserved2);

fseek(file,10L,0);//数据区的偏移量

fwrite((bmp.bfOffBits),sizeof(short),1,file);

printf("n bmp offBits: %d",bmp.bfOffBits);

fseek(file,14L,0);//文件头结构大小

fwrite((bmp.biSize),sizeof(int),1,file);

printf("n bmp bisize: %d",bmp.biSize);

fseek(file,18L,0);//图像的宽度

fwrite((bmp.biWidth),sizeof(int),1,file);

printf("n bmp biWidth: %d",bmp.biWidth);

fseek(file,22L,0);//图像的高度

fwrite((bmp.biHeight),sizeof(int),1,file);

printf("n bmp biHeight: %d",bmp.biHeight);

fseek(file,24L,0);//图像的面数

fwrite((bmp.biPlanes),sizeof(short),1,file);

printf("n bmp biplans: %d",bmp.biPlanes);

fseek(file,28L,0);//图像一个像素的字节数

fwrite((bmp.biBitCount),sizeof(short),1,file);

printf("n bmp biBitCount: %d",bmp.biBitCount);

fseek(file,30L,0);//图像压缩信息

fwrite((bmp.biCompression),sizeof(short),1,file);

printf("n bmp biCompression: %d",bmp.biCompression);

fseek(file,34L,0);//图像数据区的大小

fwrite((bmp.biSizeImage),sizeof(int),1,file);

printf("n bmp biSizeImage: %d",bmp.biSizeImage);

fseek(file,38L,0);//水平分辨率

fwrite((bmp.biXPelsPerMeter),sizeof(int),1,file);

printf("n bmp biXPelsPerMeter: %d",bmp.biXPelsPerMeter);

fseek(file,42L,0);//垂直分辨率

fwrite((bmp.biYPelsPerMeter),sizeof(int),1,file);

printf("n bmp biYPelsPerMeter: %d",bmp.biYPelsPerMeter);

fseek(file,46L,0);//颜色索引数

fwrite((bmp.biClrUsed),sizeof(int),1,file);

printf("n bmp biClrUsed: %d",bmp.biClrUsed);

fseek(file,50L,0);//重要颜色索引数

fwrite((bmp.biClrImportant),sizeof(int),1,file);

printf("n bmp biClrImportant: %dn",bmp.biClrImportant);

fseek(file,(long)(bmp.bfOffBits),0);

fwrite(imagedata,sizeof(unsigned char),bmp.biSizeImage,file);

fclose(file);

}

//pixProcess.c文件

#includestdio.h

#includestdlib.h

#includemath.h

#include"image.h"

//灰度化

void image_gray()

{

int i,j;

unsigned char tmp;

for (i=0;ibmp.biHeight;i++)

{

for (j=0;jline_byte/3;j++)

{

tmp=0.11*(*(imagedata+i*line_byte+j*3+0))+0.59*(*(imagedata+i*line_byte+j*3+1))+0.3*(*(imagedata+i*line_byte+j*3+2));

imagedata[i*line_byte+j*3+0]=tmp;

imagedata[i*line_byte+j*3+1]=tmp;

imagedata[i*line_byte+j*3+2]=tmp;

//printf("nnidsfh%d %d",i,j);

}

}

}

//二值化

void image_binarization()

{

int i,j;

for (i=0;ibmp.biHeight;i++)

{

for (j=0;jline_byte;j++)

{

if ((*(imagedata+i*line_byte+j))128)

{

imagedata[i*line_byte+j]=0;

}

else

{

imagedata[i*line_byte+j]=255;

}

}

}

}

void image_opposite() //反相

{

int i,j;

for (i=0;ibmp.biHeight;i++)

{

for (j=0;jline_byte;j++)

{

imagedata[i*line_byte+j]=abs(255-imagedata[i*line_byte+j]);

}

}

}

void image_channel() //抽取RGB通道

{

int i,j;

char rgb;

printf("nplease enter a char(r/g/b): ");

fflush(stdin);

scanf("%c",rgb);

if (rgb=='b')

{

for (i=0;ibmp.biHeight;i++)

{

for (j=0;jline_byte/3;j++)

{

imagedata[i*line_byte+3*j+1]=0;

imagedata[i*line_byte+3*j+2]=0;

}

}

}

else if(rgb=='g')

{

for (i=0;ibmp.biHeight;i++)

{

for (j=0;jline_byte/3;j++)

{

imagedata[i*line_byte+3*j]=0;

imagedata[i*line_byte+3*j+2]=0;

}

}

}

else

{

for (i=0;ibmp.biHeight;i++)

{

for (j=0;jline_byte/3;j++)

{

imagedata[i*line_byte+3*j]=0;

imagedata[i*line_byte+3*j+1]=0;

}

}

}

}

void image_bright()//改变图像亮度

{

int level;

int i,j;

printf("n please enter the level of brightness[-255 to 255] :");

fflush(stdin);

scanf("%d",level);

for (i=0;ibmp.biHeight;i++)

{

for (j=0;jline_byte;j++)

{

if (level=0)

{

if ((imagedata[i*line_byte+j]+level)255)

imagedata[i*line_byte+j]=255;

else

imagedata[i*line_byte+j]+=level;

}

else

{

if ((imagedata[i*line_byte+j]-abs(level))0)

imagedata[i*line_byte+j]=0;

else

imagedata[i*line_byte+j]+=level;

}

}

}

}

//void image_create() //创建一幅24位BMP图像文件。

//{

//main.c文件

#includestdio.h

#includestdlib.h

#includestring.h

#includeconio.h

#include"image.h"

BMP bmp;

int main()

{

FILE *file=NULL;

int choose;

char gono;

do

{

image_info(file); //imagedata已经分配了动态内存,但是没有释放

printf("n 1.image_opposite");

printf("n 2.image_gray");

printf("n 3.image_binarization");

printf("n 4.image_channel");

printf("n 5.image_brightness");

//printf("6.image_opposite");

//printf("7.image_opposite");

printf("nchoose your options:");

fflush(stdin);

scanf("%d",choose);

switch(choose)

{

case 1:

image_opposite();

image_save(file);

free(imagedata);

break;

case 2:

image_gray();

image_save(file);

free(imagedata);

break;

case 3:

image_binarization();

image_save(file);

free(imagedata);

break;

case 4:

image_channel();

image_save(file);

free(imagedata);

break;

case 5:

image_bright();

image_save(file);

free(imagedata);

break;

default:

printf("n wrong choose!");

}

printf("nlet's go on?(y/n):");

fflush(stdin);

scanf("%c",gono);

if (gono=='n')

{

printf("nbye bye!");

break;

}

}

while(1);

return 0;

}

怎样用C语言读取一张图片并进行简单处理

图片格式有很多种

bmp,

jpg,

gif,

png

等等

每种都有自己的格式。

处理图片

一般流程

都是先读取图片文件,根据格式解析成位图(bitmap)

然后对位图进行处理。

所以

重点是解析。

这个是有很多的开源C库的。

如何用c语言读取图片

#include

using namespace std;

#define Twoto1(i,j,w) i*w+j

void createimage(unsigned char *img, int w, int h)

{img = new unsigned char[w*h];}

void delateimage(unsigned char*img)

{delete []img;}

void readimage(unsigned char*img, int w, int h, char *fname)

{

FILE *fp;

fopen_s(fp,fname, "rb");

if (fp == NULL){ cout "error" endl; return; }

size_t result;

result=fread(img , sizeof(unsigned char), w*h, fp);

if (result != w*h)

{

cout "Reading error" endl;

return;

}

else

cout "Reading Ok!" endl;

fclose(fp);

}

void mobanjuanji(unsigned char image, unsigned char*image1, int w, int h, float moban[5][5])

{

for (int i = 0; i for (int j = 0; j if (iw - 3 || jh - 3)

image1[Twoto1(i,j,w)] = 0;

else

{

float temp = 0;

for (int m = 0; m5; m++)

for (int n = 0; n5; n++)

{

temp += (image[Twoto1(i-2+m,j-2+n,w)] moban[m][n]);

}

if (temp255) image1[Twoto1(i, j, w)] = 255;

else if (temp0) image1[Twoto1(i, j, w)] = 0;

else image1[Twoto1(i, j, w)] = temp;

}

}

void saveimage(unsigned char *img, int w, int h, char *fname)

{

FILE *fp;

fopen_s(fp, fname, "wb");

if (fp == NULL) { cout "error" endl; return; }

size_t result;

result = fwrite(img, sizeof(unsigned char), w*h, fp);

if (result != w*h)

{

cout "Write error" endl;

return;

}

else

cout "Write Ok!" endl;

fclose(fp);

}

void main()

{

unsigned char *img;

unsigned char *img1;

float moban[5][5] = { {0,0,0,0,0},{0, -1, 0, 1, 0 }, { 0, -2, 0, 2, 0 }, { 0, -1, 0, 1, 0 }, { 0,0,0,0,0 } };

//float moban[5][5] = { 0 };

int w = 512, h = 512;

createimage(img, w, h);

createimage(img1, w, h);

readimage(img, w, h, "E:ss.raw");

mobanjuanji(img, img1,w, h, moban);

saveimage(img, w, h, "E:ss_1.raw");

saveimage(img1, w, h, "E:ss_2.raw");

delateimage(img);

delateimage(img1);

}

扩展资料

C语言实现一个图片的读出和写入

#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("%dn",size);

FILE * pFile,*qw;

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

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

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

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

printf("%dn",size);

fread(buffer,1,size,qw);

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

fclose (pFile);

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

return 0;

}

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。