用c语言去除24位bmp图像背景色,C语言读取BMP图像,颜色反白,图像拷贝(兼容24位)...

#include

#include

#include

#include

#include

#include

#define WIDTHBYTES(i) ((i+31)/32*4)

//#pragma warning(disable: 4996)

int main()

{

BITMAPFILEHEADER bf; //BMP文件头结构体

BITMAPINFOHEADER bi; //BMP信息头结构体

FILE* fp;//指向文件的指针

RGBQUAD *ipRGB;//

DWORD LineByte,ImgSize;

DWORD NumColors;

unsigned char * * Imgdata;

int i,j;

char fileName[256];

//打开文件

printf("please enter filename:");

scanf("%s",fileName);

fp=fopen(fileName,"rb");

if(fp == NULL){

printf("Open file error!");

exit(0);

}

//读取信息头、文件头

fread(&bf,sizeof(BITMAPFILEHEADER),1,fp); //把指针fp所指向的文件的头信息写入bf(地址)

fread(&bi,sizeof(BITMAPINFOHEADER),1,fp);

LineByte=(DWORD)WIDTHBYTES(bi.biWidth*bi.biBitCount); //计算位图的实际宽度并确保它为32的倍数

ImgSize=(DWORD)LineByte*bi.biHeight;

if (bi.biClrUsed != 0 )

NumColors=(DWORD)bi.biClrUsed;

else

switch (bi.biBitCount)

{

case 1:NumColors=2;break;

case 4:NumColors=16;break;

case 8:NumColors=256;break;

case 24:NumColors=0;break;

}

//分配调色板内存

if(bi.biBitCount!=24){

ipRGB=(RGBQUAD *)malloc(NumColors*sizeof(RGBQUAD));

fread(ipRGB,sizeof(RGBQUAD),NumColors,fp);

}

Imgdata=new unsigned char*[bi.biHeight]; //声明一个指针数组

if(bi.biBitCount==24){

fseek(fp, 4, SEEK_CUR);//sizeof(RGBQUAD)

for ( i=(bi.biHeight)-1;i>=0;i--)

Imgdata[i]=new unsigned char[bi.biWidth*3]; //每个数组元素也是一个指针数组

for ( i=(bi.biHeight)-1;i>=0;i--)

for(j=0;j

fread(&Imgdata[i][j],1,1,fp);//每次只读取一个1字节,存入数组

} else {

for ( i=(bi.biHeight)-1;i>=0;i--)

Imgdata[i]=new unsigned char[bi.biWidth]; //每个数组元素也是一个指针数组

for ( i=(bi.biHeight)-1;i>=0;i--)

for(j=0;j

fread(&Imgdata[i][j],1,1,fp);//每次只读取一个1字节,存入数组

}

fclose(fp);

//写入另一个文件

fp=fopen("mybmp.bmp","wb");

fwrite(&bf,sizeof(BITMAPFILEHEADER),1,fp);

fwrite(&bi,sizeof(BITMAPINFOHEADER),1,fp);

if(bi.biBitCount!=24){

fwrite(ipRGB,sizeof(RGBQUAD),NumColors,fp);

for (i=(bi.biHeight)-1 ;i>=0;i--)

for (j=0 ;j

Imgdata[i][j] = 255 - Imgdata[i][j];

fwrite(&Imgdata[i][j],1,1,fp);

}

}else{

for (i=(bi.biHeight)-1 ;i>=0;i--)

for (j=0 ;j

Imgdata[i][j] = 255 - Imgdata[i][j];

fwrite(&Imgdata[i][j],1,1,fp);

}

}

free(Imgdata);

fclose(fp);

return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值