24位真彩图分离三通道以及分解位平面 c-c++实现
2014-03-06 20:41
351 查看
1.将24bit Lena图分离出红、绿、蓝三通道
2.将真彩图的8个位平面分别提取出来
结果如下:
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; }
结果如下:
相关文章推荐
- c++参数管理
- 24位真彩图转8位灰度图并分解位平面 c-c++实现
- [C++_12]IO_2
- 15款C/C++程序员必备的编译器和IDE
- c++ cout 控制精度、宽度、进制
- C++静态成员和静态成员函数
- 汉诺塔递归演示
- PAT_1055 world richest 多键排序
- 结构体类型(一般方式和位域存储方式)的sizeof
- windows下的C++ socket服务器(3)
- 有序的结构体数组
- 字符串移位包含问题
- 日期
- 身材有料么
- C语言用二分法求方程的近似解的方法
- C语言动态链表 取MP3歌词文件内容 带VC6.0完整工程
- 关于C++中的虚拟继承的一些总结
- C++ 虚函数表解析
- C++文件(夹)选择对话框
- open cv+C++错误及经验总结(七)