19,469
社区成员
发帖
与我相关
我的任务
分享
CFile file;
file.Open("RAW文件路径",CFile::modeRead|CFile::typeBinary);
int n = file.GetLength();
BYTE *buff;
buff=new BYTE[n];
memset(buff, 0, n);
file.Read(buff, n);
BYTE *pBGR = new BYTE[3*n];
ConvertRawY8BGGR(1280, 1024, buff, pBGR);
RGBTRIPLE *rgb;
rgb = new RGBTRIPLE[n];
ZeroMemory(rgb,sizeof(RGBTRIPLE) * n);
memcpy(rgb,pBGR,sizeof(RGBTRIPLE) * n);
SaveBmp("BMP文件路径", rgb, 24);
void ConvertRawY8BGGR(UINT32 XSize,UINT32 YSize,BYTE *pBuf,BYTE *pBGR)
{
BYTE *pR,*pB,*pG0,*pG1;
UINT32 i,j;
struct pdst
{
BYTE B;
BYTE G;
BYTE R;
}*pDst;
pDst=(struct pdst*)pBGR;
for(i=0;i<YSize-1;i++)
{
if(i&1)
{
pG1=pBuf+i*XSize;
pR=pG1+1;
pB=pG1+XSize;
pG0=pB+1;
}
else
{
pB=pBuf+i*XSize;
pG0=pB+1;
pG1=pB+XSize;
pR=pG1+1;
}
// Go through all pixels
for(j=0;j<XSize-1;j++)
{
pDst->B=*pR;
pDst->G=(BYTE)((*pG0+*pG1)/2);
pDst->R=*pB;
pDst++;
if(j&1)
{
pG0+=2;
pR+=2;
}
else
{
pB+=2;
pG1+=2;
}
}
pDst->B=0;
pDst->G=0;
pDst->R=0;
pDst++;
}
memset(pBGR+(XSize*(YSize-1))*3,0,XSize*3);
}
//保存bmp图片
BOOL SaveBmp(CString BMPFilename,RGBTRIPLE *pRGBBuf,int iBitCount)
{
long RGB_SIZE = 1280*1024*3 ;//* 3;//rgb是24位
//当是24位时候
if(iBitCount == 24)
{
//创建的文件
CFile *file= new CFile();
//位图文件头
BITMAPFILEHEADER bmpHeader;
//位图信息头(没调色板)
BITMAPINFO bmpInfo;
//创建位图
if (!file->Open(BMPFilename,CFile::modeCreate|CFile::modeReadWrite))
{
return FALSE;
}
//位图信息头
bmpHeader.bfType = 0x4d42;
bmpHeader.bfSize = RGB_SIZE + sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);//+sizeof(RGBQUAD)*256;
bmpHeader.bfReserved1 = 0;
bmpHeader.bfReserved2 = 0;
bmpHeader.bfOffBits = sizeof(BITMAPFILEHEADER) + sizeof(BITMAPINFOHEADER);//+sizeof(RGBQUAD)*256;
//位图文件头
long bits=8*128;
bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpInfo.bmiHeader.biWidth = BITMAP_WIDTH;
bmpInfo.bmiHeader.biHeight = BITMAP_HEIGHT;
bmpInfo.bmiHeader.biPlanes = 1;
bmpInfo.bmiHeader.biBitCount = 24;
bmpInfo.bmiHeader.biCompression = BI_RGB;
bmpInfo.bmiHeader.biSizeImage =RGB_SIZE;// ;WIDTHBYTES(bits)*256
bmpInfo.bmiHeader.biXPelsPerMeter = 0;
bmpInfo.bmiHeader.biYPelsPerMeter = 0;
bmpInfo.bmiHeader.biClrUsed = 0;
bmpInfo.bmiHeader.biClrImportant = 0;
//写入位图文件头
file->Write(&bmpHeader,sizeof(BITMAPFILEHEADER));
//写入位图信息
file->Write(&(bmpInfo.bmiHeader),sizeof(BITMAPINFOHEADER));
//写入位图数据
file->Write(pRGBBuf,RGB_SIZE);
//关闭文件
file->Close();
return TRUE;
}
else
return FALSE;
}