/****************************************************************
这个程序演示了读取和保存.dat图像文件数据。
.dat图像文件以矩阵形式保存8位灰度图像和24位真彩色图像,其编排
格式如下:
对HxW灰度图像(G为0-255之间的数据,每个像素点1字节表示)
G G G G G ... G -
G G G G G ... G |
G G G G G ... G > H行
... |
G G G G G ... G -
\_____ _____/
\/
W列
按从左到右,从上到下的顺序扫描,串行化后顺序保存
对HxW 24位真彩色图像(R、G、B分别为0-255之间的数据,每个像素点3字节表示)
BGR BGR BGR BGR BGR ... BGR -
BGR BGR BGR BGR BGR ... BGR |
BGR BGR BGR BGR BGR ... BGR > H行
... |
BGR BGR BGR BGR BGR ... BGR -
\___________ ___________/
\/
W列
按从左到右,从上到下的顺序扫描,串行化后顺序保存
written by Y.B. Mao, with Dept. of Automation
Nanjing University of Sci. & Tech.
2004.10
Warning:
该程序只可用于教学、科研等非商业用途
****************************************************************/
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
/****************************************************************
读取图像文件中的数据
输入参数:
int Height: 图像高(行数)
int Width: 图像宽(列数)
int ColorBit: 像素的位数,只能为8或24
FILE * fp: 文件句柄
输出参数:
unsigned char * Data:读入的图像数据,对于灰度图像大小为WxH字节;
彩色数据为WxHx3字节
****************************************************************/
void ImageDataRead( unsigned char * Data, int Height, int Width,
int ColorBit, FILE * fp )
{
int x,y;
unsigned char indata;
if ( ColorBit == 8 ) /* 对8位灰度图像的处理 */
{
for ( y = 0; y < Height; y++ )
for ( x = 0; x < Width; x++ )
{
fread( &indata, sizeof(unsigned char), 1, fp );
Data[ y*Width+x ] = indata;
}
}
else /* 对24位真彩色图像的处理 */
{
for ( y = 0; y < Height; y++ )
for ( x = 0; x < Width; x++ )
{
fread( &indata, sizeof(unsigned char), 1, fp );
Data[ (y*Width+x)*3 ] = indata; // read in B
fread( &indata, sizeof(unsigned char), 1, fp );
Data[ (y*Width+x)*3+1 ] = indata; // read in G
fread( &indata, sizeof(unsigned char), 1, fp );
Data[ (y*Width+x)*3+2 ] = indata; // read in R
}
}
return;
}
/****************************************************************
保存图像数据到文件中
输入参数:
int Height: 图像高(行数)
int Width: 图像宽(列数)
int ColorBit: 像素的位数,只能为8或24
FILE * fp: 文件句柄
unsigned char * Data:读入的图像数据,对于灰度图像大小为WxH字节;
彩色数据为WxHx3字节
输出参数:
无
****************************************************************/
void ImageDataWrite( unsigned char * Data, int Height, int Width,
int ColorBit, FILE * fp )
{
int x,y;
unsigned char outdata;
if ( ColorBit == 8 ) /* 对8位灰度图像的处理 */
{
for ( y = 0; y < Height; y++ )
for ( x = 0; x < Width; x++ )
{
outdata = Data[ y*Width+x ];
fwrite( ( unsigned char * ) &outdata, sizeof( unsigned char ), 1, fp );
}
}
else /* 对24位真彩色图像的处理 */
{
for ( y = 0; y < Height; y++ )
for ( x = 0; x < Width; x++ )
{
outdata = Data[ (y*Width+x)*3 ]; // output B
fwrite( ( unsigned char * ) &outdata, sizeof( unsigned char ), 1, fp );
outdata = Data[ (y*Width+x)*3+1 ]; // output G
fwrite( ( unsigned char * ) &outdata, sizeof( unsigned char ), 1, fp );
outdata = Data[ (y*Width+x)*3+2 ]; // output R
fwrite( ( unsigned char * ) &outdata, sizeof( unsigned char ), 1, fp );
}
}
return;
}