C++ 代码如何实现读取和.raw格式图像,急,希望大家帮忙,谢谢。

guoliyaner 2009-02-11 09:51:25
C++ 代码如何实现读取和.raw格式图像,急,希望大家帮忙,谢谢。
...全文
2137 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zheng05211256 2011-07-12
  • 打赏
  • 举报
回复
最终解决了么?
dzq138 2010-01-12
  • 打赏
  • 举报
回复
看了一下,上面jixingzhong兄台的参考
查看了一下代码中的

CDib* pDib= new CDib(m_sizeImage, 8);  //没有说明是什么东东

还好,在网上找到了这个关键的类...


// cdib.h declaration for Inside Visual C++ CDib class

#ifndef _INSIDE_VISUAL_CPP_CDIB
#define _INSIDE_VISUAL_CPP_CDIB

class CDib : public CObject
{
enum Alloc {noAlloc, crtAlloc, heapAlloc};
DECLARE_SERIAL(CDib)
public:
LPVOID m_lpvColorTable;
HBITMAP m_hBitmap;
LPBYTE m_lpImage; // starting address of DIB bits
LPBITMAPINFOHEADER m_lpBMIH; // buffer containing the BITMAPINFOHEADER
private:
HGLOBAL m_hGlobal; // For external windows we need to free;
// could be allocated by this class or allocated externally
Alloc m_nBmihAlloc;
Alloc m_nImageAlloc;
DWORD m_dwSizeImage; // of bits -- not BITMAPINFOHEADER or BITMAPFILEHEADER
int m_nColorTableEntries;

HANDLE m_hFile;
HANDLE m_hMap;
LPVOID m_lpvFile;
HPALETTE m_hPalette;
public:
BOOL WriteToFile(CString strPath);
BOOL LoadFromFile(CString strPath);
CDib();
CDib(CSize size, int nBitCount); // builds BITMAPINFOHEADER
~CDib();
int GetSizeImage() {return m_dwSizeImage;}
int GetSizeHeader()
{return sizeof(BITMAPINFOHEADER) + sizeof(RGBQUAD) * m_nColorTableEntries;}
CSize GetDimensions();
BOOL AttachMapFile(const char* strPathname, BOOL bShare = FALSE);
BOOL CopyToMapFile(const char* strPathname);
BOOL AttachMemory(LPVOID lpvMem, BOOL bMustDelete = FALSE, HGLOBAL hGlobal = NULL);
BOOL Draw(CDC* pDC, CPoint origin, CSize size); // until we implemnt CreateDibSection
HBITMAP CreateSection(CDC* pDC = NULL);
UINT UsePalette(CDC* pDC, BOOL bBackground = FALSE);
BOOL MakePalette();
BOOL SetSystemPalette(CDC* pDC);
BOOL Compress(CDC* pDC, BOOL bCompress = TRUE); // FALSE means decompress
HBITMAP CreateBitmap(CDC* pDC);
BOOL Read(CFile* pFile);
BOOL ReadSection(CFile* pFile, CDC* pDC = NULL);
BOOL Write(CFile* pFile);
BOOL IsEmpty();
void Serialize(CArchive& ar);
void Empty();
private:
void DetachMapFile();
void ComputePaletteSize(int nBitCount);
void ComputeMetrics();
};
#endif // _INSIDE_VISUAL_CPP_CDIB



dzq138 2010-01-12
  • 打赏
  • 举报
回复
http://topic.csdn.net/t/20040102/21/2628023.html#
dzq138 2010-01-12
  • 打赏
  • 举报
回复
正有处理大图像的需要.6G文件,TIF,不给保存.
看来只能用这个格式了.
xpcer 2009-02-12
  • 打赏
  • 举报
回复
就是简单的文件读取,关键就用一个CFile就Ok了,还有看你raw的文件格式,进行解析。
guoliyaner 2009-02-12
  • 打赏
  • 举报
回复
谢谢,非常感谢,试一下,分数随后加上。
jixingzhong 2009-02-11
  • 打赏
  • 举报
回复
参考代码:
# #include "Raw.h"
#
# #ifdef _DEBUG
# #undef THIS_FILE
# static char THIS_FILE[]=__FILE__;
# #define new DEBUG_NEW
# #endif
#
# //////////////////////////////////////////////////////////////////////
# // Construction/Destruction
# //////////////////////////////////////////////////////////////////////
#
# CRaw::CRaw()
# //无参数初始化,不分配内存.
# {
# m_sizeImage= CSize(0,0);
# m_pBuff= NULL;
#
# }
#
# CRaw::CRaw(CSize sizeImage)
# //初始化,指定图像大小,并分配相应的内存.
# {
# m_sizeImage= sizeImage;
# m_nWidth = m_sizeImage.cx;
# m_nHeight = m_sizeImage.cy;
# m_pBuff= new BYTE[sizeImage.cy*sizeImage.cx];
# memset(m_pBuff, 0, sizeImage.cy*sizeImage.cx*sizeof(BYTE));
# }
#
# CRaw::CRaw(CSize sizeImage, BYTE *pBuff)
# //初始化,sizeImage:图像大小,pBuff:指向像素位的指针.
# {
# m_sizeImage= sizeImage;
# m_nWidth = m_sizeImage.cx;
# m_nHeight = m_sizeImage.cy;
# m_pBuff= new BYTE[sizeImage.cy*sizeImage.cx];
# memcpy(m_pBuff, pBuff, sizeImage.cy*sizeImage.cx*sizeof(BYTE));
# }
#
# CRaw::~CRaw()
# {
# if (m_pBuff!=NULL)
# delete m_pBuff;
#
# }
#
# //下面是从文件的路径读写RAW格式的图像, 这里是文件存储路径
#
# BOOL CRaw::ReadFromFile(CString strFilename)
# //从文件中读取Raw图像,strFilename:源文件的完整路径和文件名.
# {
# CFile file;
# CFileException ex;
# int nWidth, nHeight;
#
# CString strError1= "文件打开错误!";
# CString strError2= "非正确的raw格式文件!";
#
# if (!file.Open(strFilename, CFile::modeRead, &ex)){
# ex.ReportError();
# return FALSE;
# }
#
# if (file.Read(&nHeight, sizeof(int))!=sizeof(int)){
# AfxMessageBox(strError1, MB_OK|MB_ICONEXCLAMATION);
# file.Close();
# return FALSE;
# }
#
# if (file.Read(&nWidth, sizeof(int))!=sizeof(int)){
# AfxMessageBox(strError1, MB_OK|MB_ICONEXCLAMATION);
# file.Close();
# return FALSE;
# }
#
# m_sizeImage.cy= nHeight;
# m_sizeImage.cx= nWidth;
# m_nHeight = nHeight;
# m_nWidth = nWidth;
# m_pBuff= new BYTE[nHeight*nWidth];
#
# if (file.ReadHuge(m_pBuff, nHeight*nWidth)!=(nHeight*nWidth)){
# AfxMessageBox(strError2, MB_OK|MB_ICONEXCLAMATION);
# file.Close();
# return FALSE;
# }
#
# file.Close();
# return TRUE;
# }
#
#
# BOOL CRaw::WriteToFile(CString strFilename)
# //将Raw图像写到文件, strFilename:目标文件的完整路径和文件名.
# {
# CFile file;
# CFileException ex;
# int nHeight, nWidth;
#
# nHeight= m_sizeImage.cy;
# nWidth= m_sizeImage.cx;
#
# if (!file.Open(strFilename, CFile::modeCreate|CFile::modeWrite, &ex)){
# ex.ReportError();
# return FALSE;
# }
#
# file.Write(&nHeight, sizeof(int));
# file.Write(&nWidth, sizeof(int));
#
# file.WriteHuge(m_pBuff, nHeight*nWidth*sizeof(BYTE));
#
# file.Close();
#
# return TRUE;
#
# }
#
# // 这下面是RAW图像格式和BITMAP图像格式的相互间的交互转换
# CDib* CRaw::GetDib()
# //由Raw图像获得Dib位图.
# {
# CDib* pDib= new CDib(m_sizeImage, 8);
# BYTE* pColorTable= (BYTE*) pDib->m_lpvColorTable;
# BYTE* pImage;
# CSize sizeDib;
# int nX, nY;
#
# if (m_sizeImage.cx%4==0)
# sizeDib.cx=m_sizeImage.cx;
# else
# sizeDib.cx=((m_sizeImage.cx)/4+1)*4;
# sizeDib.cy=m_sizeImage.cy;
#
# for (int i=0; i<256; i++){
# pColorTable[i*4]= i;
# pColorTable[i*4+1]= i;
# pColorTable[i*4+2]= i;
# pColorTable[i*4+3]= 0;
# }
#
# pImage= new BYTE[sizeDib.cy*sizeDib.cx];
# memset(pImage, 0, sizeDib.cy*sizeDib.cx);
#
# for (nY=0; nY<m_sizeimage.cy; ny++)="" for="" (nx="0;" nx=""><m_sizeimage.cx; nx++)="" pimage[ny*sizedib.cx+nx]="m_pBuff[(m_sizeImage.cy-1-nY)*m_sizeImage.cx+nX];" pdib-="">m_lpImage= pImage;
# return pDib;
# }
#
# BOOL CRaw::GetFromDib(CDib *pDib)
# //由Dib位图获得Raw图像.
# {
# int nX, nY;
# int nDibWidth;
# BYTE* pImage= pDib->m_lpImage;
#
# if (pDib->m_lpBMIH->biBitCount!=8)
# return FALSE;
#
# m_sizeImage= pDib->GetDimensions();
# m_nWidth = m_sizeImage.cx;
# m_nHeight = m_sizeImage.cy;
# if ( (m_sizeImage.cx%4)!=0 )
# nDibWidth= (m_sizeImage.cx/4+1)*4;
# else
# nDibWidth= m_sizeImage.cx;
#
# m_pBuff= new BYTE[m_sizeImage.cx*m_sizeImage.cy];
#
# for (nY=0; nY<m_sizeimage.cy; ny++)="" for="" (nx="0;" nx=""><m_sizeimage.cx; nx++)="" m_pbuff[ny*m_sizeimage.cx+nx]="pImage[(m_sizeImage.cy-1-nY)*nDibWidth+nX];" return="" true;="" }="" void="" craw::serialize(carchive="" &ar)="" {="" dword="" dwpos;="" dwpos="ar.GetFile()-">GetPosition();
# TRACE("CRaw::Serialize -- pos = %d\n", dwPos);
# ar.Flush();
# dwPos = ar.GetFile()->GetPosition();
# TRACE("CRwa::Serialize -- pos = %d\n", dwPos);
#
# if(ar.IsStoring()) {
# Write(ar.GetFile());
# }
# else {
# Read(ar.GetFile());
# }
# }
#
# //下面是从文件中读RAW图像,以及向文件中写RAW图像
# BOOL CRaw::Write(CFile *pFile)
# {
# int nHeight, nWidth;
# nHeight= m_sizeImage.cy;
# nWidth= m_sizeImage.cx;
#
# try {
# pFile->Write(&nHeight, sizeof(int));
# pFile->Write(&nWidth, sizeof(int));
# pFile->WriteHuge(m_pBuff, nHeight*nWidth);
# }
# catch (CException *pe){
# pe->Delete();
# AfxMessageBox("File wirte error!", IDOK);
# return FALSE;
# }
#
# return TRUE;
# }
#
# BOOL CRaw::Read(CFile *pFile)
# {
# int nHeight, nWidth;
#
# try {
# pFile->Read(&nHeight, sizeof(int));
# pFile->Read(&nWidth, sizeof(int));
# m_nWidth = nWidth;
# m_nHeight - nHeight;
# m_sizeImage.cx= nWidth;
# m_sizeImage.cy= nHeight;
#
# m_pBuff= new BYTE[nHeight*nWidth];
#
# int nCount= pFile->ReadHuge(m_pBuff, nHeight*nWidth);
# if (nCount!=nWidth*nHeight)
# throw new CException;
# }
# catch (CException *pe){
# pe->Delete();
# AfxMessageBox("File read error!", IDOK);
# return FALSE;
# }
#
# return TRUE;
# }
#
#
# void CRaw::Empty()
# {
# if (m_pBuff!=NULL)
# delete m_pBuff;
# m_pBuff = NULL;
#
# }
#
# BOOL CRaw::IsEmpty()
# {
# if(m_pBuff != NULL)
# return FALSE;
# return TRUE;
# }
jixingzhong 2009-02-11
  • 打赏
  • 举报
回复
1.RAW结构是纯像素数据文件,里面只有每个像素的值,没有文件头、调色板等数据,所以要想正确显示一个RAW文件图像,必须人工指定它的长、宽和像素深度。
2.每个像素根据格式不同占有不同的字节,如8位256色每个像素占一个字节;24位真彩色每个像素占三个字节。
3.要自己写,注意:
(1)函数要有此RAW文件的长、宽和像素深度三个参数,从而得到BMP文件头,存入strBMP[]的前面;
(2)函数里把读进来的RAW文件数据strRaw[]里的数据进行行反转放入strBMP[]中文件头之后,即把第length-1-i行(从第0行开始记,i从0开始)的数据放到第i行,而每行里的数据不变。这样做是因为BMP文件里的像素数据是从最后一行即length-1开始的。
(3)使用显示BMP文件的函数来显示此strBMP[]里的图像文件。

64,637

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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