#include "stdio.h"
#include "Windows.h"
//几个全局变量,存放读入图像的位图数据、宽、高、颜色表及每像素所占位数(比特)
//此处定义全局变量主要为了后面的图像数据访问及图像存储作准备
unsigned char *pBmpBuf;//读入图像数据的指针
int bmpWidth;//图像的宽
int bmpHeight;//图像的高
RGBQUAD *pColorTable;//颜色表指针
int biBitCount;//图像类型
bool readBmp(char *bmpName)
{
//二进制读方式打开指定的图像文件
FILE *fp=fopen(bmpName,"rb");
if(fp==0) return 0;
//跳过位图文件头结构BITMAPFILEHEADER
fseek(fp, sizeof(BITMAPFILEHEADER),0);
//定义位图信息头结构变量,读取位图信息头进内存,存放在变量head中
BITMAPINFOHEADER head;
fread(&head, sizeof(BITMAPINFOHEADER), 1,fp);
//获取图像宽、高、每像素所占位数等信息
bmpWidth = head.biWidth;
bmpHeight = head.biHeight;
biBitCount = head.biBitCount;
//定义变量,计算图像每行像素所占的字节数(必须是4的倍数)
int lineByte=(bmpWidth * biBitCount/8+3)/4*4;
//灰度图像有颜色表,且颜色表表项为256
if(biBitCount==8){
//申请颜色表所需要的空间,读颜色表进内存
pColorTable=new RGBQUAD[256];
fread(pColorTable,sizeof(RGBQUAD),256,fp);
}
//申请位图数据所需要的空间,读位图数据进内存
pBmpBuf=new unsigned char[lineByte * bmpHeight];
fread(pBmpBuf,1,lineByte * bmpHeight,fp);
//关闭文件
fclose(fp);
return 1;
}
bool saveBmp(char *bmpName, unsigned char *imgBuf, int width, int height,
int biBitCount, RGBQUAD *pColorTable)
{
//如果位图数据指针为0,则没有数据传入,函数返回
if(!imgBuf)
return 0;
//颜色表大小,以字节为单位,灰度图像颜色表为1024字节,彩色图像颜色表大小为0
int colorTablesize=0;
if(biBitCount==8)
colorTablesize=1024;
//待存储图像数据每行字节数为4的倍数
int lineByte=(width * biBitCount/8+3)/4*4;
//以二进制写的方式打开文件
FILE *fp=fopen(bmpName,"wb");
if(fp==0) return 0;
//申请位图文件头结构变量,填写文件头信息
BITMAPFILEHEADER fileHead;
fileHead.bfType = 0x4D42;//bmp类型
//bfSize是图像文件4个组成部分之和
fileHead.bfSize= sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER)
+ colorTablesize + lineByte*height;
fileHead.bfReserved1 = 0;
fileHead.bfReserved2 = 0;
//bfOffBits是图像文件前三个部分所需空间之和
fileHead.bfOffBits=54+colorTablesize;
//写文件头进文件
fwrite(&fileHead, sizeof(BITMAPFILEHEADER),1, fp);
//申请位图信息头结构变量,填写信息头信息
BITMAPINFOHEADER head;
head.biBitCount=biBitCount;
head.biClrImportant=0;
head.biClrUsed=0;
head.biCompression=0;
head.biHeight=height;
head.biPlanes=1;
head.biSize=40;
head.biSizeImage=lineByte*height;
head.biWidth=width;
head.biXPelsPerMeter=0;
head.biYPelsPerMeter=0;
//写位图信息头进内存
fwrite(&head, sizeof(BITMAPINFOHEADER),1, fp);
//如果灰度图像,有颜色表,写入文件
if(biBitCount==8)
fwrite(pColorTable, sizeof(RGBQUAD),256, fp);
//写位图数据进文件
fwrite(imgBuf, height*lineByte, 1, fp);
//关闭文件
fclose(fp);
return 1;
}
//调色板与灰度图像的关系
void main()
{
//读入指定BMP文件进内存
char readPath[]="tarret.BMP";
readBmp(readPath);
//输出图像的信息
printf("width=%d,height=%d,biBitCount=%d\n",bmpWidth,bmpHeight,biBitCount);
//改变灰度图像的颜色表蓝色分量的值,察看前后变化
if(biBitCount==8){
for(int i=0; i<256;i++){
pColorTable[i].rgbBlue = 255-pColorTable[i].rgbBlue;
}
}
//将图像数据存盘
char writePath[]="tarret1.BMP";
saveBmp(writePath, pBmpBuf, bmpWidth, bmpHeight, biBitCount, pColorTable);
//清除缓冲区,pBmpBuf和pColorTable是全局变量,在文件读入时申请的空间
delete []pBmpBuf;
if(biBitCount==8)
delete []pColorTable;
}
#include "stdio.h"
#include "Windows.h"
BYTE *pBmpBuf;//读¨¢入¨?图ª?像?数ºy据Y的Ì?指?针?
int bmpWidth;//图ª?像?的Ì?宽¨ª
int bmpHeight;//图ª?像?的Ì?高?
RGBQUAD *pColorTable;//颜?色¦?表À¨ª指?针?
int biBitCount;//图ª?像?类¤¨¤型¨ª
bool readBmp(char *bmpName)
{
FILE *fp=fopen(bmpName,"rb"); //二t进?制?读¨¢方¤?式º?打䨰开a指?定¡§的Ì?图ª?像?文?件t
if(fp==NULL) return 0;
fseek(fp, sizeof(BITMAPFILEHEADER),0); //跳¬?过y位?图ª?文?件t头ª¡¤结¨¢构1BITMAPFILEHEADER
BITMAPINFOHEADER head; //定¡§义°?位?图ª?信?息¡é头ª¡¤结¨¢构1变À?量¢?,ê?读¨¢取¨?位?图ª?信?息¡é头ª¡¤进?内¨²存ä?,ê?存ä?放¤?在¨²变À?量¢?head中D
fread(&head, sizeof(BITMAPINFOHEADER), 1,fp);
bmpWidth = head.biWidth; //获?取¨?图ª?像?宽¨ª、¡é高?、¡é每?像?素?所¨´占?位?数ºy等̨¨信?息¡é
bmpHeight = head.biHeight;
biBitCount = head.biBitCount;
int lByte=(bmpWidth * biBitCount/8+3)/4*4; //定¡§义°?变À?量¢?,ê?计?算?图ª?像?每?行D像?素?所¨´占?的Ì?字Á?节¨²数ºy
/* if(biBitCount==8){
pColorTable=new RGBQUAD[256];
fread(pColorTable,sizeof(RGBQUAD),256,fp);
}*/
pBmpBuf=new BYTE[lByte * bmpHeight]; //申¦¨º请?位?图ª?数ºy据Y所¨´需¨¨要°a的Ì?空?间?,ê?读¨¢位?图ª?数ºy据Y进?内¨²存ä?
fread(pBmpBuf,1,lByte * bmpHeight,fp);
fclose(fp); //关?闭À?文?件t
return 1;
}
bool saveBmp(char *bmpName, BYTE *imgBuf, int width, int height,
int biBitCount, RGBQUAD *pColorTable)
{
if(!imgBuf)
return 0;
int colorTablesize=0; //颜?色¦?表À¨ª大䨮小?,以°?字Á?节¨²为a单Ì£¤位?,灰¨°度¨¨图ª?像?颜?色¦?表À¨ª为a1024字Á?节¨²,彩¨º色¦?图ª?像?颜?色¦?表À¨ª大䨮小?为a0
/* if(biBitCount==8)
colorTablesize=1024;*/
int lByte=(width * biBitCount/8+3)/4*4; //待äy存ä?储ä¡é图ª?像?数ºy据Y每?行D字Á?节¨²数ºy
FILE *fp=fopen(bmpName,"wb"); //以°?二t进?制?写¡ä的Ì?方¤?式º?打䨰开a文?件t
if(fp==NULL) return 0;
//申¦¨º请?位?图ª?文?件t头ª¡¤结¨¢构1变À?量¢?,ê?填¬?写¡ä文?件t头ª¡¤信?息¡é
BITMAPFILEHEADER fileHead;
fileHead.bfType = 0x4D42;//bmp类¤¨¤型¨ª
//bfSize是º?图ª?像?文?件t4个?组Á¨¦成¨¦部?分¤?之?和¨ª
fileHead.bfSize= sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER) + colorTablesize + lByte*height;
fileHead.bfReserved1 = 0;
fileHead.bfReserved2 = 0;
//bfOffBits是º?图ª?像?文?件t前¡ã三¨y个?部?分¤?所¨´需¨¨空?间?之?和¨ª
fileHead.bfOffBits=54+colorTablesize;
fwrite(&fileHead, sizeof(BITMAPFILEHEADER),1, fp); //写¡ä文?件t头ª¡¤进?文?件t
BITMAPINFOHEADER head; //申¦¨º请?位?图ª?信?息¡é头ª¡¤结¨¢构1变À?量¢?,ê?填¬?写¡ä信?息¡é头ª¡¤信?息¡é
head.biBitCount=biBitCount;
head.biClrImportant=0;
head.biClrUsed=0;
head.biCompression=0;
head.biHeight=height;
head.biPlanes=1;
head.biSize=40;
head.biSizeImage=lByte*height;
head.biWidth=width;
head.biXPelsPerMeter=0;
head.biYPelsPerMeter=0;
fwrite(&head, sizeof(BITMAPINFOHEADER),1, fp); //写¡ä位?图ª?信?息¡é头ª¡¤进?内¨²存ä?
fwrite(imgBuf, height*lByte, 1, fp); //写¡ä位?图ª?数ºy据Y进?文?件t
fclose(fp); //关?闭À?文?件t
return 1;
}
bool rgb_to_yuv(BYTE *imgBuf, int width, int height){
int i=0,j=0;
for( i=0;i< height;i++ ){
for( j=0;j
int pos = width * i + j; // 像?素?点Ì?位?置?
BYTE B = imgBuf[pos*3];
BYTE G = imgBuf[pos*3+1];
BYTE R = imgBuf[pos*3+2];
BYTE Y= (BYTE)(0.3*R + 0.59*G + 0.11*B);
BYTE U= (BYTE)((B-Y) * 0.493);
BYTE V= (BYTE)((R-Y) * 0.877);
Y=Y+10;
B= (BYTE)(Y + 2.032*U);
G= (BYTE)(Y - 0.394*U - 0.581*V);
R= (BYTE)(Y + 1.140*V);
imgBuf[pos*3]=B;
imgBuf[pos*3+1]=G;
imgBuf[pos*3+2]=R;
}
}
return 1;
}
void main(int argc,char *argv[])
{
char readPath[]="C:\\1.BMP";
readBmp(readPath); //读¨¢入¨?指?定¡§BMP文?件t
printf("width=%d,height=%d,biBitCount=%d\n",bmpWidth,bmpHeight,biBitCount); //输º?出?图ª?像?的Ì?信?息¡é
char writePath[]="C:\\tarret1.BMP"; //将?图ª?像?数ºy据Y存ä?盘¨¬
saveBmp(writePath, pBmpBuf, bmpWidth, bmpHeight, biBitCount, pColorTable);
delete []pBmpBuf; //清?除y缓o冲?区?,ê?pBmpBuf和¨ªpColorTable是º?全¨?局?变À?量¢?,ê?在¨²文?件t读¨¢入¨?时º¡À申¦¨º请?的Ì?空?间?
if(biBitCount==8)
delete []pColorTable;
scanf("%d");
}
本文来源:https://www.2haoxitong.net/k/doc/5436ba16a216147917112809.html
文档为doc格式