怎样读取RAW数据?

client_sz 2011-12-06 11:38:30
请假各位大神,RAW数据是怎样的形式啊?怎么才能把它读入并写进程序中呢,本人菜鸟,刚开始学MFC,现在有一个RAW数据转化为BMP的作业,希望大神门赐教。
...全文
974 26 打赏 收藏 转发到动态 举报
写回复
用AI写文章
26 条回复
切换为时间正序
请发表友善的回复…
发表回复
client_sz 2011-12-09
  • 打赏
  • 举报
回复
希望能有个缓冲的时间,好让我先入门把,呵呵。
client_sz 2011-12-09
  • 打赏
  • 举报
回复
非常感谢,我研究下吧,因为之前没做过项目,所以想找个实例研究下,谢了!
liquoryellow 2011-12-09
  • 打赏
  • 举报
回复
剩下的你自己调试一下,已经进行了彩色插值,但是RAW的格式未必是BGGR,所以图像可能色彩不对,你自己调整下。如果还有弄不出来,我也没话说了。既然爱好,就自己努力一下吧,全靠别人也不行吧。
liquoryellow 2011-12-09
  • 打赏
  • 举报
回复
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;
}

client_sz 2011-12-08
  • 打赏
  • 举报
回复
对编程很感兴趣,所以想在这个领域学起,也知道这是个漫长的过程,但现在找来这份工作,任务一定是必须完成的,容不得我慢慢学起,很无奈啊,不想失去这个机会。
client_sz 2011-12-08
  • 打赏
  • 举报
回复
我想从一个实例开始学起,这样会快一点,如果这周这个东西做不出来,我就惨啦!
client_sz 2011-12-08
  • 打赏
  • 举报
回复
谢谢你的解释,其实我只是会一些基础的C和C++语法,对位图和图像处理这部分之前根本没接触过,现在开始做任务,网上就查位图,概念是理解了,但是怎样实现在代码上就没门路了,很困惑,不知道是基础太差还是智商问题,唉!
liquoryellow 2011-12-08
  • 打赏
  • 举报
回复
他现在已经不需要插值了,所以楼上的可以省略掉。
至于怎么变成三个值么,就是多出两个相等的值就可以了。代码自己弄弄,不然啥都学不到了。
ndy_w 2011-12-08
  • 打赏
  • 举报
回复
只有raw数据是不全的,你需要掩码的排列形式。掩码指明该点的量化值是什么颜色的分量(也可能是复合量,sony的CCD好像就有cyan分量)。因此,对每个像素点,你都只能知道它的一部分颜色分量信息。而缺少的颜色分量,你需要根据周围的点(包含此颜色分量信息的)插值计算出来。可以做得很复杂,也可以做得简单,比如取最近的2个或4个点求平均。
client_sz 2011-12-08
  • 打赏
  • 举报
回复
图像大小是1280*1024,8位的。真心不知道怎么读取,我的作业是把它转化为bmp图像显示出来,用MFC做出来,现在什么都不懂,急呀,哪位贴个代码我看看吧,据说这东西不难,但我就是不知道该从哪儿下手,囧囧囧!
client_sz 2011-12-07
  • 打赏
  • 举报
回复
很感谢,我上面那部分代码是不是能读进去我不知道,而且,这么读的话不知道是不是挨个值读,有没有遍历,还有,怎么将一个值变成三个一样的值?
liquoryellow 2011-12-07
  • 打赏
  • 举报
回复
要是那样的话,很容易了。。。读取文件,就是读取二进制文件。
挨个值读,一个值变成三个一样的值。保存到BMP图像文件中就可以了。再细就得贴代码了。
还是自己弄一弄比较好。

昨夜无风 2011-12-07
  • 打赏
  • 举报
回复
你首先要弄清楚你的图像有多大,以及像素位数(8位的就一个像素一个字节,24位的一个像素读三个字节),然后排成一幅图像就行了。

要是自己懒的编,photoshop可以打开raw文件,要选择图像位数和长宽
Kevin_qing 2011-12-07
  • 打赏
  • 举报
回复
raw格式是不固定的,好像跟实现方式有关。

貌似连width/height都没有。里面就是rgb数据。
你可以猜测下width/height,然后rgb画出来试试看。

看文件大小是否等于width*height=size/3

client_sz 2011-12-07
  • 打赏
  • 举报
回复
up up up着急呀,谁来帮帮忙
liquoryellow 2011-12-06
  • 打赏
  • 举报
回复
就是一个2进制文件,里面的数据格式可能是RG,GB,或者BG,GR,或者GR,BG等六种吧。
要变成BMP,如果是彩色图像,可以先插值,然后加BMP头,保存就可以了。
gold_water 2011-12-06
  • 打赏
  • 举报
回复
没搞股,帮顶;
猜:是否类似于二进制文件操作。
client_sz 2011-12-06
  • 打赏
  • 举报
回复
大神们帮帮忙呀,表示对RAW数据不了解,网上查了些资料,要加调色板和信息头,这个信息头该怎么去加呢?具体是怎样的步骤啊?
client_sz 2011-12-06
  • 打赏
  • 举报
回复
刚才在网上查了下,可以把RAW数据读进数组中
int width;
int height;
DWORD dwImageSize=width*height;
BYTE* pImageData=new BYTE[dwImageSize];
file.Read(pImageData,dwImageSize);
这样行吗?大神们来帮帮忙啊!
client_sz 2011-12-06
  • 打赏
  • 举报
回复
各位帮帮忙哈,raw数据是怎么样的,用什么方法能把它读出来?
加载更多回复(6)

19,469

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧