RAW文件的读取

来源:互联网 发布:灰色模型软件 编辑:程序博客网 时间:2024/05/22 06:44

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[]里的图像文件。

 

 

1 参考代码: 2 # #include "Raw.h" 3 # 4 # #ifdef _DEBUG 5 # #undef THIS_FILE 6 # static char THIS_FILE[]=__FILE__; 7 # #define new DEBUG_NEW 8 # #endif 9 # 10 # ////////////////////////////////////////////////////////////////////// 11  # // Construction/Destruction 12  # ////////////////////////////////////////////////////////////////////// 13  # 14 # CRaw::CRaw() 15 # //无参数初始化,不分配内存. 16 # { 17 # m_sizeImage= CSize(0,0); 18 # m_pBuff= NULL; 19 # 20 # } 21 # 22 # CRaw::CRaw(CSize sizeImage) 23 # //初始化,指定图像大小,并分配相应的内存. 24 # { 25 # m_sizeImage= sizeImage; 26 # m_nWidth = m_sizeImage.cx; 27 # m_nHeight = m_sizeImage.cy; 28 # m_pBuff= new BYTE[sizeImage.cy*sizeImage.cx]; 29 # memset(m_pBuff, 0, sizeImage.cy*sizeImage.cx*sizeof(BYTE)); 30 # } 31 # 32 # CRaw::CRaw(CSize sizeImage, BYTE *pBuff) 33 # //初始化,sizeImage:图像大小,pBuff:指向像素位的指针. 34 # { 35 # m_sizeImage= sizeImage; 36 # m_nWidth = m_sizeImage.cx; 37 # m_nHeight = m_sizeImage.cy; 38 # m_pBuff= new BYTE[sizeImage.cy*sizeImage.cx]; 39 # memcpy(m_pBuff, pBuff, sizeImage.cy*sizeImage.cx*sizeof(BYTE)); 40 # } 41 # 42 # CRaw::~CRaw() 43 # { 44 # if (m_pBuff!=NULL) 45 # delete m_pBuff; 46 # 47 # } 48 # 49 # //下面是从文件的路径读写RAW格式的图像, 这里是文件存储路径 50 # 51 # BOOL CRaw::ReadFromFile(CString strFilename) 52 # //从文件中读取Raw图像,strFilename:源文件的完整路径和文件名. 53 # { 54 # CFile file; 55 # CFileException ex; 56 # int nWidth, nHeight; 57 # 58 # CString strError1= "文件打开错误!"; 59 # CString strError2= "非正确的raw格式文件!"; 60 # 61 # if (!file.Open(strFilename, CFile::modeRead, &ex)){ 62 # ex.ReportError(); 63 # return FALSE; 64 # } 65 # 66 # if (file.Read(&nHeight, sizeof(int))!=sizeof(int)){ 67 # AfxMessageBox(strError1, MB_OK|MB_ICONEXCLAMATION); 68 # file.Close(); 69 # return FALSE; 70 # } 71 # 72 # if (file.Read(&nWidth, sizeof(int))!=sizeof(int)){ 73 # AfxMessageBox(strError1, MB_OK|MB_ICONEXCLAMATION); 74 # file.Close(); 75 # return FALSE; 76 # } 77 # 78 # m_sizeImage.cy= nHeight; 79 # m_sizeImage.cx= nWidth; 80 # m_nHeight = nHeight; 81 # m_nWidth = nWidth; 82 # m_pBuff= new BYTE[nHeight*nWidth]; 83 # 84 # if (file.ReadHuge(m_pBuff, nHeight*nWidth)!=(nHeight*nWidth)){ 85 # AfxMessageBox(strError2, MB_OK|MB_ICONEXCLAMATION); 86 # file.Close(); 87 # return FALSE; 88 # } 89 # 90 # file.Close(); 91 # return TRUE; 92 # } 93 # 94 # 95 # BOOL CRaw::WriteToFile(CString strFilename) 96 # //将Raw图像写到文件, strFilename:目标文件的完整路径和文件名. 97 # { 98 # CFile file; 99 # CFileException ex; 100 # int nHeight, nWidth; 101 # 102 # nHeight= m_sizeImage.cy; 103 # nWidth= m_sizeImage.cx; 104 # 105 # if (!file.Open(strFilename, CFile::modeCreate|CFile::modeWrite, &ex)){ 106 # ex.ReportError(); 107 # return FALSE; 108 # } 109 # 110 # file.Write(&nHeight, sizeof(int)); 111 # file.Write(&nWidth, sizeof(int)); 112 # 113 # file.WriteHuge(m_pBuff, nHeight*nWidth*sizeof(BYTE)); 114 # 115 # file.Close(); 116 # 117 # return TRUE; 118 # 119 # } 120 # 121 # // 这下面是RAW图像格式和BITMAP图像格式的相互间的交互转换 122 # CDib* CRaw::GetDib() 123 # //由Raw图像获得Dib位图. 124 # { 125 # CDib* pDib= new CDib(m_sizeImage, 8); 126 # BYTE* pColorTable= (BYTE*) pDib->m_lpvColorTable; 127 # BYTE* pImage; 128 # CSize sizeDib; 129 # int nX, nY; 130 # 131 # if (m_sizeImage.cx%4==0) 132 # sizeDib.cx=m_sizeImage.cx; 133 # else 134 # sizeDib.cx=((m_sizeImage.cx)/4+1)*4; 135 # sizeDib.cy=m_sizeImage.cy; 136 # 137 # for (int i=0; i<256; i++){ 138 # pColorTable[i*4]= i; 139 # pColorTable[i*4+1]= i; 140 # pColorTable[i*4+2]= i; 141 # pColorTable[i*4+3]= 0; 142 # } 143 # 144 # pImage= new BYTE[sizeDib.cy*sizeDib.cx]; 145 # memset(pImage, 0, sizeDib.cy*sizeDib.cx); 146 # 147 # 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; 148 # return pDib; 149 # } 150 # 151 # BOOL CRaw::GetFromDib(CDib *pDib) 152 # //由Dib位图获得Raw图像. 153 # { 154 # int nX, nY; 155 # int nDibWidth; 156 # BYTE* pImage= pDib->m_lpImage; 157 # 158 # if (pDib->m_lpBMIH->biBitCount!=8) 159 # return FALSE; 160 # 161 # m_sizeImage= pDib->GetDimensions(); 162 # m_nWidth = m_sizeImage.cx; 163 # m_nHeight = m_sizeImage.cy; 164 # if ( (m_sizeImage.cx%4)!=0 ) 165 # nDibWidth= (m_sizeImage.cx/4+1)*4; 166 # else 167 # nDibWidth= m_sizeImage.cx; 168 # 169 # m_pBuff= new BYTE[m_sizeImage.cx*m_sizeImage.cy]; 170 # 171 # 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(); 172 # TRACE("CRaw::Serialize -- pos = %d\n", dwPos); 173 # ar.Flush(); 174 # dwPos = ar.GetFile()->GetPosition(); 175 # TRACE("CRwa::Serialize -- pos = %d\n", dwPos); 176 # 177 # if(ar.IsStoring()) { 178 # Write(ar.GetFile()); 179 # } 180 # else { 181 # Read(ar.GetFile()); 182 # } 183 # } 184 # 185 # //下面是从文件中读RAW图像,以及向文件中写RAW图像 186 # BOOL CRaw::Write(CFile *pFile) 187 # { 188 # int nHeight, nWidth; 189 # nHeight= m_sizeImage.cy; 190 # nWidth= m_sizeImage.cx; 191 # 192 # try { 193 # pFile->Write(&nHeight, sizeof(int)); 194 # pFile->Write(&nWidth, sizeof(int)); 195 # pFile->WriteHuge(m_pBuff, nHeight*nWidth); 196 # } 197 # catch (CException *pe){ 198 # pe->Delete(); 199 # AfxMessageBox("File wirte error!", IDOK); 200 # return FALSE; 201 # } 202 # 203 # return TRUE; 204 # } 205 # 206 # BOOL CRaw::Read(CFile *pFile) 207 # { 208 # int nHeight, nWidth; 209 # 210 # try { 211 # pFile->Read(&nHeight, sizeof(int)); 212 # pFile->Read(&nWidth, sizeof(int)); 213 # m_nWidth = nWidth; 214 # m_nHeight - nHeight; 215 # m_sizeImage.cx= nWidth; 216 # m_sizeImage.cy= nHeight; 217 # 218 # m_pBuff= new BYTE[nHeight*nWidth]; 219 # 220 # int nCount= pFile->ReadHuge(m_pBuff, nHeight*nWidth); 221 # if (nCount!=nWidth*nHeight) 222 # throw new CException; 223 # } 224 # catch (CException *pe){ 225 # pe->Delete(); 226 # AfxMessageBox("File read error!", IDOK); 227 # return FALSE; 228 # } 229 # 230 # return TRUE; 231 # } 232 # 233 # 234 # void CRaw::Empty() 235 # { 236 # if (m_pBuff!=NULL) 237 # delete m_pBuff; 238 # m_pBuff = NULL; 239 # 240 # } 241 # 242 # BOOL CRaw::IsEmpty() 243 # { 244 # if(m_pBuff != NULL) 245 # return FALSE; 246 # return TRUE; 247 # }
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 天猫商家欺骗买家怎么办 阿里买家投诉我发空包怎么办 苹果6s电池坏了怎么办 hm买的单鞋脏了怎么办 微店违规屏蔽搜索怎么办 ios微信支付失效怎么办 京东第三方店铺关闭怎么办 京东店铺关门了怎么办 国美退款不到账怎么办 小米小店通过了怎么办 苹果的发票丢了怎么办 苹果7p开不开机怎么办 申请退款了怎么卖家还发货怎么办 买家申请退款卖家不退款怎么办 卖家恶意不退款怎么办 欠条到期了对方不还钱怎么办 冰箱磕了一坑怎么办 办信用卡没有家庭地址的怎么办 钱付了货没收到怎么办 在苏宁易购上买东西地址错了怎么办 手机分期付款银行卡丢了怎么办 华硕笔记本鼠标不动了怎么办 韵达快递不派送怎么办 中通快递不派送怎么办 农业银行信用卡密码输错三次怎么办 农业银行卡多次输错密码怎么办 想把店长弄走怎么办 济南银座卡过期了怎么办 银座购物卡丢失后怎么办 银座的卡丢了怎么办 银行卡换了旧卡怎么办 大理市民卡丢了怎么办 市民卡内的钱怎么办 宝付支付乱扣款怎么办 苏宁任性贷逾期怎么办 第二次跟家里开口要钱还网贷怎么办 网贷到家来要钱怎么办 网贷贷不了啦急要钱怎么办 百度推广竞价关键词太长怎么办 药店位置差客流少怎么办 网站上的用词违规怎么办