RAW文件读写

本文深入探讨了信息技术领域的核心概念,包括前端开发、后端开发、移动开发、游戏开发、大数据开发、AI音视频处理等多个细分领域的重要技术和实践。文章详细介绍了各种技术的基本原理、应用场景和发展趋势,旨在为读者提供全面的技术视野。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

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
# }

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
# }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值