请问如何将数据存为图像文件?

greenflash 2003-12-25 12:10:32
我有一组数据(150*150),根据它们值的不同,我在VC里面可以在界面上
用一个带色的矩形表示数值在150*150象素空间的分布情况,采用的是hot配色
方案。但是,我不知道怎么把我在界面上画出来的图形用程序保存下来,比如
存成256色的bmp文件。烦请指教,谢谢~
...全文
54 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
dnnupt 2004-01-11
  • 打赏
  • 举报
回复
mark
greenflash 2004-01-11
  • 打赏
  • 举报
回复
拷屏最大的麻烦就是每帧图像对不齐,我的图像显示又是做在VC界面上的,
所以希望能单独把图像先存下来,做flash的时候至少大小一样,位置对起
来也方便。
caesar22 2004-01-10
  • 打赏
  • 举报
回复
用位图做FLASH,肯定是要钝的吧...位图那么一个大东西...可不可以先用拷屏,然后在来个压缩,搞成JPG那样的.....
greenflash 2004-01-09
  • 打赏
  • 举报
回复
感谢前面的两位:) 有没有实例啊?

to:fridayeve
现在我就是用的屏幕copy,在导入Flash做动画的时候感觉很不方便。
于是又用Matlab来单独画图,但感觉整体上很不流畅。所以才想问问
怎么直接把图像保存下来。
fridayeve 2004-01-08
  • 打赏
  • 举报
回复
保存下来的目的何在,是为了以后看自己的杰作方便吗,呵呵,拷屏就行了
hoget 2004-01-02
  • 打赏
  • 举报
回复
首先要写.bmp文件的信息头,然后按照数据的不同,附与不同的灰度值。如果数据量不是很大,最好用24位真彩色,否则看不出效果。
位图文件的格式如下:
位图文件(Bitmap-File,BMP)格式是Windows采用的图像文件存储格式,在Windows环境下运行的所有图像处理软件都支持这种格式。Windows 3.0以前的BMP位图文件格式与显示设备有关,因此把它称为设备相关位图(device-dependent bitmap,DDB)文件格式。Windows 3.0以后的BMP位图文件格式与显示设备无关,因此把这种BMP位图文件格式称为设备无关位图(device-independent bitmap,DIB)格式,目的是为了让Windows能够在任何类型的显示设备上显示BMP位图文件。BMP位图文件默认的文件扩展名是BMP或者bmp。

6.1.2 文件结构

位图文件可看成由4个部分组成:位图文件头(bitmap-file header)、位图信息头(bitmap-information header)、彩色表(color table)和定义位图的字节阵列,它们的名称和符号如表6-01所示。

表6-01 BMP图像文件组成部分的名称和符号


位图文件的组成
结构名称
符号

位图文件头(bitmap-file header)
BITMAPFILEHEADER
bmfh

位图信息头(bitmap-information header)
BITMAPINFOHEADER
bmih

彩色表(color table)
RGBQUAD
aColors[]

图像数据阵列字节
BYTE
aBitmapBits[]



位图文件结构可综合在表6-02中。

表6-02 位图文件结构内容摘要


  偏移量
域的名称
大小
内容

 

 

 

图像文件


0000h
标识符(Identifier)
2 bytes
两字节的内容用来识别位图的类型:

‘BM’ : Windows 3.1x, 95, NT, …

‘BA’ :OS/2 Bitmap Array

‘CI’ :OS/2 Color Icon

‘CP’ :OS/2 Color Pointer

‘IC’ : OS/2 Icon

‘PT’ :OS/2 Pointer

  0002h
File Size
1 dword
用字节表示的整个文件的大小

  0006h
Reserved
1 dword
保留,设置为0

  000Ah
Bitmap Data Offset
1 dword
从文件开始到位图数据开始之间的数据(bitmap data)之间的偏移量

  000Eh
Bitmap Header Size
1 dword
位图信息头(Bitmap Info Header)的长度,用来描述位图的颜色、压缩方法等。下面的长度表示:

28h - Windows 3.1x, 95, NT, …

0Ch - OS/2 1.x

F0h - OS/2 2.x

  0012h
Width
1 dword
位图的宽度,以像素为单位

  0016h
Height
1 dword
位图的高度,以像素为单位

  001Ah
Planes
1 word
位图的位面数


图像

信息



 

 
001Ch
Bits Per Pixel
1 word
每个像素的位数

1 - Monochrome bitmap

4 - 16 color bitmap

8 - 256 color bitmap

16 - 16bit (high color) bitmap

24 - 24bit (true color) bitmap

32 - 32bit (true color) bitmap

  001Eh
Compression
1 dword
压缩说明:

0 - none (也使用BI_RGB表示)

1 - RLE 8-bit / pixel (也使用BI_RLE4表示)

2 - RLE 4-bit / pixel (也使用BI_RLE8表示)

3 - Bitfields (也使用BI_BITFIELDS表示)

  0022h
Bitmap Data Size
1 dword
用字节数表示的位图数据的大小。该数必须是4的倍数

  0026h
HResolution
1 dword
用像素/米表示的水平分辨率

  002Ah
VResolution
1 dword
用像素/米表示的垂直分辨率

  002Eh
Colors
1 dword
位图使用的颜色数。如8-位/像素表示为100h或者 256.

  0032h
Important Colors
1 dword
指定重要的颜色数。当该域的值等于颜色数时,表示所有颜色都一样重要

调色板数据
0036h
Palette
N * 4 byte
调色板规范。对于调色板中的每个表项,这4个字节用下述方法来描述RGB的值:

1字节用于蓝色分量
1字节用于绿色分量
1字节用于红色分量
1字节用于填充符(设置为0)

图像数据
0436h
Bitmap Data
x bytes
该域的大小取决于压缩方法,它包含所有的位图数据字节,这些数据实际就是彩色调色板的索引号



 

zilili2000 2003-12-28
  • 打赏
  • 举报
回复
建议:把图像信息存入一个2维数组,
我做过24位位图保存的一个项目,其中用到的大致方法如下,希望对你有所帮助:
DWORD widthBytes=3*w;//w为宽度
while((widthBytes&3)!=0)widthBytes++;
DWORD dwsavewidthBytes=widthBytes;
DWORD dwDibBytes=dwsavewidthBytes*h;//h为高度
DWORD dwFileSize=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER)+dwDibBytes;
DWORD dwOffBits=sizeof(BITMAPFILEHEADER)+sizeof(BITMAPINFOHEADER);

BITMAPFILEHEADER bf;
bf.bfType=0x4d42;
bf.bfSize=dwFileSize;
bf.bfOffBits=dwOffBits;
bf.bfReserved1=0;
bf.bfReserved2=0;

BITMAPINFOHEADER bmInfo;
bmInfo.biSize=sizeof(BITMAPINFOHEADER);
bmInfo.biWidth=w;
bmInfo.biHeight=h;
bmInfo.biPlanes=1;
bmInfo.biBitCount=(DWORD)24;//24位
bmInfo.biCompression=0;
bmInfo.biSizeImage=0;
bmInfo.biXPelsPerMeter=0;
bmInfo.biYPelsPerMeter=0;
bmInfo.biClrUsed=0;
bmInfo.biClrImportant=0;

CFile file;
file.Open(filename,CFile::modeCreate | CFile::modeReadWrite | CFile::shareExclusive);
file.Write(&bf,sizeof(BITMAPFILEHEADER));
file.Write(&bmInfo,sizeof(BITMAPINFOHEADER));

DWORD dwLength=3*w;//24位位图,每个像素用3个字节保存;
DWORD dwDibWidthBytes=(w*24+31)/32*4;//每个像素占24位;
DWORD dwBaseIndex=0;
for(int i=y;i<h;i++)
{
LPSTR lpsRaw=(LPSTR)(m_lpBuf+dwBaseIndex);
file.Write(lpsRaw,dwLength);
dwBaseIndex+=dwDibWidthBytes+3*x;
}
file.Close();
greenflash 2003-12-25
  • 打赏
  • 举报
回复
?? 没人知道吗?

4,499

社区成员

发帖
与我相关
我的任务
社区描述
图形图像/机器视觉
社区管理员
  • 机器视觉
  • 迪菲赫尔曼
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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