本文目录一览:
- 1、用C语言怎么读取BMP格式的图片
- 2、C语言 读取BMP文件
- 3、如何用C语言读取bmp文件和pix文件?
- 4、c语言,怎样读取一个BMP图片?
- 5、关于怎么用C++读取bmp图片
- 6、如何用c语言读取图片
用C语言怎么读取BMP格式的图片
没有标准函数读。
需要根据BMP文件的结构定义,读出头部和每个颜色值。
struct
header
{
unsigned
short
int
bfType;
unsigned
int
bfSize;
unsigned
short
int
bfReserved1;
unsigned
short
int
bfReserved2;
unsigned
int
bfoffBits;
}__attribute__
((packed));
struct
tinfoheader
{
unsigned
int
biSize;
unsigned
int
biWidth;
unsigned
int
biHeight;
unsigned
short
int
biPlanes;
unsigned
short
int
biBitCount;
unsigned
int
biCompression;
unsigned
int
biSizeImage;
unsigned
int
biXPelsPerMeter;
unsigned
int
biYPelsPerMeter;
unsigned
int
biClrUsed;
unsigned
int
biClrImportant;
}__attribute__
((packed));
C语言 读取BMP文件
读取文件方法:先定义一个int类型的文件描述符变量,再用open函数(适合在Unix或Linux环境下,若是在windows环境下应先定义一个FILE类型的指针变量,再调用fopen函数)打开所要读取的BMP文件即可。如果你要更改BMP文件的颜色,那么就看你对BMP格式的图片的存储原理知道多少了,bmp是无损压缩图片的一种算法,一般是由图片头部,文件头部,颜色表等组成,要改变颜色,就需要改变颜色表中的内容,当然由于BMP算法在不断改进,其过程和组成部分可能有变化,上面的仅是一般情况。-c从文件读取bmp图片
如何用C语言读取bmp文件和pix文件?
调用windowsAPI.
先HBITMAP bitmap=(HBITMAP)LoadImage("asdf.bmp",NULL,图像格式,LR_LOADFROMFILE);//从文件读图片
BITMAP bm;
GetObject(bitmap,bm);
unsigned char *pix=new unsigned char[bm.widthpiexl*bm.height]; SetBitmapPiex(bitmap,bm.widthpiexl*bm.height,pix); -c从文件读取bmp图片
这样子便可以得到图像的像素参数,存放在pix数组内,
BMP文件由文件头、位图信息头、颜色信息和图形数据四部分组成。颜色信息包含图像所用到的颜色表,显示图像时需用到这个颜色表来生成调色板.我们需要做的是,新建PIX文件后,用WINHEX打开,准备好模板文件,提取BMP中的颜色信息,粘贴到PIX文件的头文件中,然后保存即可.可以用ddraw.h读详细资料请看msdn,希望能帮到你。-c从文件读取bmp图片
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: %u\n",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: %d\n",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)); -c从文件读取bmp图片
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图片
可以看下如下的操作:
1、图片文件是有固定格式的,像BMP图片是文件头+位图的颜色数据。
文件头一般在读取的时候是使用下面的代码:
BITMAPFILEHEADER fileheader={0};
fread(fileheader,sizeof(fileheader),1,fp);
if(fileheader.bfType!=0x4D42) // 判断是否为BMP图片
{
fclose(fp);
return ;
}
BITMAPINFOHEADER head;
fread(head,sizeof(BITMAPINFOHEADER),1,fp);
long bmpWidth = head.biWidth; //获取图片的宽
long bmpHeight = head.biHeight; //获取图片的宽
WORD biBitCount = head.biBitCount;
if(biBitCount != 24) // 是否为24位位图
{
::AfxMessageBox(_T("请选择24位位图!"));
fclose(fp);
return ;
}
2、文件读到这里了就要读到位图的颜色数据了,那么在读取前,需要知道数据的大小,这样才能把分配具体大学的缓冲区,之后把数据完整的读取到缓冲区内。
那么计算位图数据的大小一般用下面的代码去做。
int totalSize = (bmpWidth *biBitCount/8+3)/4*4*bmpHeight;
BYTE *pBmpBuf = new BYTE[totalSize];
3、在这些工作做完之后,就使用fread命令直接读取文件内容即可,直到读到文件结束。
整个具体的代码实现如下:
FILE *fp=NULL;
int ret = fopen_s(fp,"D:\\11.bmp","rb");
if(fp==0)
{
return ;
}
BITMAPFILEHEADER fileheader={0};
fread(fileheader,sizeof(fileheader),1,fp);
if(fileheader.bfType!=0x4D42)
{
fclose(fp);
return ;
}
BITMAPINFOHEADER head;
fread(head,sizeof(BITMAPINFOHEADER),1,fp);
long bmpWidth = head.biWidth;
long bmpHeight = head.biHeight;
WORD biBitCount = head.biBitCount;
if(biBitCount != 24)
{
::AfxMessageBox(_T("请选择24位位图!"));
fclose(fp);
return ;
}
int totalSize = (bmpWidth *biBitCount/8+3)/4*4*bmpHeight;
BYTE *pBmpBuf = new BYTE[totalSize];
size_t size = 0;
while(true)
{
int iret = fread(pBmpBuf[size],1,1,fp);
if(iret == 0)
break;
size = size + iret;
}
fclose(fp);
int i,j;
CClientDC dc(this);
int pitch=bmpWidth%4;
for(i=0;ibmpHeight;i++)
{
int realPitch=i*pitch;
for(j=0;jbmpWidth;j++)
{
dc.SetPixel(j,i,RGB(
pBmpBuf[(i*bmpWidth+j)*3+2+realPitch],
pBmpBuf[(i*bmpWidth+j)*3+1+realPitch],
pBmpBuf[(i*bmpWidth+j)*3+realPitch]));
}
}
delete [] pBmpBuf; pBmpBuf = NULL;
return ;
如何用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 } };-c从文件读取bmp图片
//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("%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;
}