您的位置:首页 > 编程语言 > C语言/C++

24位真彩图分离三通道以及分解位平面 c-c++实现

2014-03-06 20:41 351 查看
1.将24bit Lena图分离出红、绿、蓝三通道

2.将真彩图的8个位平面分别提取出来

#include
#include
#include
#include
using  namespace std;

/*
typedef struct tagBITMAPFILEHEADER
{
WORD bfType; // 位图文件的类型,必须为BM(1-2字节)
DWORD bfSize; // 位图文件的大小,以字节为单位(3-6字节)
WORD bfReserved1; // 位图文件保留字,必须为0(7-8字节)
WORD bfReserved2; // 位图文件保留字,必须为0(9-10字节)
DWORD bfOffBits; // 位图数据的起始位置,以相对于位图(11-14字节)
// 文件头的偏移量表示,以字节为单位
} BITMAPFILEHEADER;

typedef struct tagBITMAPINFOHEADER{
DWORD biSize; // 本结构所占用字节数(15-18字节)
LONG biWidth; // 位图的宽度,以像素为单位(19-22字节)
LONG biHeight; // 位图的高度,以像素为单位(23-26字节)
WORD biPlanes; // 目标设备的级别,必须为1(27-28字节)
WORD biBitCount;// 每个像素所需的位数,必须是1(双色),(29-30字节)
// 4(16色),8(256色)16(高彩色)或24(真彩色)之一
DWORD biCompression; // 位图压缩类型,必须是 0(不压缩),(31-34字节)
// 1(BI_RLE8压缩类型)或2(BI_RLE4压缩类型)之一
DWORD biSizeImage; // 位图的大小(其中包含了为了补齐行数是4的倍数而添加的空字节),以字节为单位(35-38字节)
LONG biXPelsPerMeter; // 位图水平分辨率,每米像素数(39-42字节)
LONG biYPelsPerMeter; // 位图垂直分辨率,每米像素数(43-46字节)
DWORD biClrUsed;// 位图实际使用的颜色表中的颜色数(47-50字节)
DWORD biClrImportant;// 位图显示过程中重要的颜色数(51-54字节)
} BITMAPINFOHEADER;
*/

int deThreeChannel()
{
BITMAPFILEHEADER fileHeader;
BITMAPINFOHEADER infoHeader;
BYTE *img,*newimg;
FILE* pfin =fopen("original.bmp","r+b");

//Read the Bitmap file header;
fread(&fileHeader,sizeof(BITMAPFILEHEADER),1,pfin);
//Read the Bitmap info header;
fread(&infoHeader,sizeof(BITMAPINFOHEADER),1,pfin);

if(infoHeader.biBitCount==24)
{
int i=0,j=0;

if(infoHeader.biWidth%4!=0)
infoHeader.biWidth=(infoHeader.biWidth+3)/4*4;
if(infoHeader.biHeight%4!=0)
infoHeader.biHeight=(infoHeader.biHeight +3)/4*4;
infoHeader.biSizeImage=infoHeader.biWidth*infoHeader.biHeight*3;

img =new BYTE[infoHeader.biSizeImage];
memset(img,0,infoHeader.biSizeImage);
fread(img,sizeof(BYTE),infoHeader.biSizeImage,pfin);
fclose(pfin);

char filename1[20]={"blueChannel"},filename2[20]={"greenChannel"},filename3[20]={"redChannel"};
FILE* pfout1 = fopen(strcat(filename1,".bmp"), "w+b");
FILE* pfout2 = fopen(strcat(filename2,".bmp"), "w+b");
FILE* pfout3 = fopen(strcat(filename3,".bmp"), "w+b");

BYTE red,green,blue;
newimg=new BYTE[infoHeader.biSizeImage];
//blueChannel
for(i=0;i<infoHeader.biSizeImage;i+=3)
{
blue=img[i];
green=img[i+1];
red=img[i+2];

red=red&0;
green=green&0;
newimg[j]=blue;
newimg[j+1]=green;
newimg[j+2]=red;
j+=3;
}

fwrite( &fileHeader , sizeof(fileHeader) , 1 , pfout1 );
fwrite( &infoHeader , sizeof(infoHeader) , 1 , pfout1);
fwrite(newimg,sizeof(BYTE) , infoHeader.biSizeImage , pfout1 );
fclose(pfout1);
//greenChannel
j=0;
for(i=0;i<infoHeader.biSizeImage;i+=3)
{
blue=img[i];
green=img[i+1];
red=img[i+2];

red=red&0;
blue=blue&0;
newimg[j]=blue;
newimg[j+1]=green;
newimg[j+2]=red;
j+=3;
}

fwrite( &fileHeader , sizeof(fileHeader) , 1 , pfout2);
fwrite( &infoHeader , sizeof(infoHeader) , 1 , pfout2);
fwrite(newimg,sizeof(BYTE) , infoHeader.biSizeImage , pfout2 );
fclose(pfout2);
//redChannel
j=0;
for(i=0;i<infoHeader.biSizeImage;i+=3)
{
blue=img[i];
green=img[i+1];
red=img[i+2];

green=green&0;
blue=blue&0;
newimg[j]=blue;
newimg[j+1]=green;
newimg[j+2]=red;
j+=3;
}

fwrite( &fileHeader , sizeof(fileHeader) , 1 , pfout3);
fwrite( &infoHeader , sizeof(infoHeader) , 1 , pfout3);
fwrite(newimg,sizeof(BYTE) , infoHeader.biSizeImage , pfout3);
fclose(pfout3);
}
return 0;
}

int deBitPlane()
{
BITMAPFILEHEADER fileHeader;
BITMAPINFOHEADER infoHeader;
BYTE *img,*temp,*newimg;
FILE* pfin =fopen("original.bmp","r+b");

//Read the Bitmap file header;
fread(&fileHeader,sizeof(BITMAPFILEHEADER),1,pfin);
//Read the Bitmap info header;
fread(&infoHeader,sizeof(BITMAPINFOHEADER),1,pfin);

if(infoHeader.biBitCount==24)
{
int i=0,j=0;

if(infoHeader.biWidth%4!=0)
infoHeader.biWidth=(infoHeader.biWidth+3)/4*4;
if(infoHeader.biHeight%4!=0)
infoHeader.biHeight=(infoHeader.biHeight +3)/4*4;
infoHeader.biSizeImage=infoHeader.biWidth*infoHeader.biHeight*3;

img =new BYTE[infoHeader.biSizeImage];
memset(img,0,infoHeader.biSizeImage);
fread(img,sizeof(BYTE),infoHeader.biSizeImage,pfin);
fclose(pfin);

char filename[20];
BYTE red,green,blue;
temp=new BYTE[infoHeader.biSizeImage];
newimg=new BYTE[infoHeader.biSizeImage];

for(i=0;i<8;i++)
{
sprintf(filename,"colorPlane%d",i+1);
FILE* pfout = fopen(strcat(filename,".bmp"), "w+b");
int k=0;
for(j=0;j<infoHeader.biSizeImage;j+=3)
{
temp[j]=img[j];
temp[j+1]=img[j+1];
temp[j+2]=img[j+2];

temp[j]=temp[j]&(1<<i);
temp[j+1]=temp[j+1]&(1<<i);
temp[j+2]=temp[j+2]&(1<<i);

newimg[k]=temp[j];
newimg[k+1]=temp[j+1];
newimg[k+2]=temp[j+2];
k+=3;
}

fwrite( &fileHeader , sizeof(fileHeader) , 1 , pfout );
fwrite( &infoHeader , sizeof(infoHeader) , 1 , pfout );
fwrite(newimg,sizeof(BYTE) , infoHeader.biSizeImage , pfout );
fclose(pfout);
}
}
return 0;
}

int main()
{
deThreeChannel();
deBitPlane();

return 0;
}

结果如下:





















内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: