图像保存为bmp文件 一个512×512的彩色图像,已经解码出来了,RGB分别放在三个数组中channel[0]、channel[1]、channel[2]中,如何保存为bmp格式文件? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 http://it.sohu.com/2004/03/15/78/article219447801.shtml 用OpenCV很容易做//channel[0]、channel[1]、channel[2] 分别是usnigned char类型的,长度为512 * 512的数组const int nWidth = 512;const int nHeight = 512;IplImage* pImg = cvCreateImage(cvSize(nWidth, nHeight), IPL_DEPTH_8U, 3);int nCount = 0;for(int i = 0; i < nHeight; i++){ for(int j = 0; j < nWidth; j++) { unsigned char* pData = (unsigned char*)(pImg->imageData + j * pImg->widthStep + i * pImg->nChannels * sizeof(unsigned char)); //OpenCV中RGB的排列顺序是BGR pData[2] = channel[0][nCount]; //R pData[1] = channel[1][nCount]; //G pData[0] = channel[2][nCount]; //B nCount++; }}cvSaveImage("BMPImage.bmp"); 首先要知道bmp位图格式1.文件头2.文件信息头3.调色版4.图像数据从楼主的数据看来,应该是24位的吧那没必要用到调色板BITMAPFILEHEADER bf; //位图文件头BITMAPINFOHEADER bi; //位图信息头BYTE *lpBuf; //位图数据int nWidth = 512; //位图宽int nHeight = 512; //位图高//BMP文件信息头bi.biSize = 40;bi.biWidth = nWidth;bi.biHeight = nHeight;bi.biPlanes = 1;bi.biBitCount = 24;bi.biCompression = BI_RGB;bi.biSizeImage = (nWidth*24 +31)/32*4*nHeight;bi.biXPelsPerMeter = 0;bi.biYPelsPerMeter = 0;bi.biClrUsed = 0;bi.biClrImportant = 0;//为图像数据申请空间lpBuf = (BYTE*)malloc( sizeof(BYTE) * bi.biSizeImage );//BMP文件头bf.bfType = 0x4d42;bf.bfSize = 14 + 40 + bi.biSizeImage;bf.bfReserved1 = 0;bf.bfReserved2 = 0;bf.bfOffBits = 14 + 40;CFile file;file.Open("C://bmp.bmp", CFile::Create|CFile::Write);file.Write((void*)&bf, sizeof(BITMAPFILEHEADER));file.Write((void*)&bi, sizeof(BITMAPINFOHEADER));file.Write((void*)lpBuf, sizeof(BYTE) * bi.biSizeImage);file.Close();以上代码没上机测试过.这只是方法 放在groupbox上的控件全部隐藏 com组件在win7 + ie8上无法加载 【请教】读取图像灰度值的.dat文件问题 怎么让一个程序在内存中只有它的一个进程? 问个mysql的问题 请教,数据保存的问题? drawtextex问题 高分相送,求vc下载! 各位兄弟帮帮我! vc 读取数据集的问题??? 为什么调用API出现这样的错误? 急寻帮助
const int nHeight = 512;
IplImage* pImg = cvCreateImage(cvSize(nWidth, nHeight), IPL_DEPTH_8U, 3);
int nCount = 0;
for(int i = 0; i < nHeight; i++)
{
for(int j = 0; j < nWidth; j++)
{
unsigned char* pData = (unsigned char*)(pImg->imageData + j * pImg->widthStep + i * pImg->nChannels * sizeof(unsigned char));
//OpenCV中RGB的排列顺序是BGR
pData[2] = channel[0][nCount]; //R
pData[1] = channel[1][nCount]; //G
pData[0] = channel[2][nCount]; //B
nCount++;
}
}cvSaveImage("BMPImage.bmp");
1.文件头
2.文件信息头
3.调色版
4.图像数据从楼主的数据看来,应该是24位的吧
那没必要用到调色板BITMAPFILEHEADER bf; //位图文件头
BITMAPINFOHEADER bi; //位图信息头
BYTE *lpBuf; //位图数据
int nWidth = 512; //位图宽
int nHeight = 512; //位图高
//BMP文件信息头
bi.biSize = 40;
bi.biWidth = nWidth;
bi.biHeight = nHeight;
bi.biPlanes = 1;
bi.biBitCount = 24;
bi.biCompression = BI_RGB;
bi.biSizeImage = (nWidth*24 +31)/32*4*nHeight;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;//为图像数据申请空间
lpBuf = (BYTE*)malloc( sizeof(BYTE) * bi.biSizeImage );//BMP文件头
bf.bfType = 0x4d42;
bf.bfSize = 14 + 40 + bi.biSizeImage;
bf.bfReserved1 = 0;
bf.bfReserved2 = 0;
bf.bfOffBits = 14 + 40;CFile file;
file.Open("C://bmp.bmp", CFile::Create|CFile::Write);
file.Write((void*)&bf, sizeof(BITMAPFILEHEADER));
file.Write((void*)&bi, sizeof(BITMAPINFOHEADER));
file.Write((void*)lpBuf, sizeof(BYTE) * bi.biSizeImage);
file.Close();以上代码没上机测试过.这只是方法