一个初级问题。。。(关于图像)(100分)

  • 主题发起人 主题发起人 xx
  • 开始时间 开始时间
X

xx

Unregistered / Unconfirmed
GUEST, unregistred user!
一个很简单的问题,
怎样从裸数据文件中生成BMP图像并显示出来呢?最好能给出一个例子,比如
一个256*256的位图,其header有1078个字节,接下来就是256*256的图像数
据。假如要把它显示出来,该怎么做?

以前曾收集过,但一时找不到了,还请各位大虾帮忙!
实在是着急!
小弟这厢有礼了。
 
不用Tbitmap类?为什么?
 
我的意思是针对裸数据文件,即仅有数据,比如256*256的数据,不是位图文件,
没有位图的header.
 
去www.csdn.net上有
在 开发资源->文件格式
 
给你的数据加上个BITMAPINFO结构做头, 然后用createdibsection建立一
个HBITMAP赋给tbitmap.
 
光有数据,没有调色版怎么成?
 
有调色板,256级灰度。
 
同意Another_eYes的意见,你也必须知道原始位图的大小。
 
拜托,具体一点啦,比如256*256的数据。。。
 
BITMAPINFO记录类型:

tagBITMAPINFOHEADER = packed record
biSize: DWORD; //记录的大小 = SizeOf(TBitmapInfoHeader)
biWidth: Longint; //位图的宽度,以象素为单位
biHeight: Longint; //位图的高度,以象素为单位
biPlanes: Word; //设为1
biBitCount: Word; //位图颜色位数,256级灰度设为8
biCompression: DWORD; //位图数据压缩方式,如未压缩可设为BI_RGB
biSizeImage: DWORD; //位图数据长度
biXPelsPerMeter: Longint; //以下几项可以全都为0
biYPelsPerMeter: Longint;
biClrUsed: DWORD;
biClrImportant: DWORD;
end;
TBitmapInfoHeader = tagBITMAPINFOHEADER;

tagBITMAPINFO = packed record
bmiHeader: TBitmapInfoHeader;
bmiColors: array[0..0] of TRGBQuad; //调色板数据,256级灰度可做为256色调色板处理
end;
TBitmapInfo = tagBITMAPINFO;

CreateDIBSection没用过,不太清楚,你可以看一下API的帮助文档。
Delphi的VCL源码Graphics.pas中有用到,可以参考一下。
 
var
i: Integer;
bmpinfo: PBitmapInfo;
bmp: TBitmap;
Bits: Pointer;
begin
bmp := TBitmap.Create;
getmem(bmpinfo, sizeof(TBitmapInfoHeader) + //BitmapInfoHeader大小
sizeof(TRGBQuad)*256 + //颜色表大小
length(你的裸数据)
);
with bmpinfo^ do
begin
with bmiHeader do
begin
biSize := sizeof(TBitmapInfoHeader);
biWidth := 256;
biHeight := 256;
biPlanes := 1;
biBitCount := 8;
biCompression := BI_RLE8;
biSizeImage := length(你的裸数据);
biXPelsPerMeter := 97 * 254;
biYPelsPerMeter := 97 * 254;
biClrUsed := 0;
biClrImportant := 0;
end;
for i := 0 to 255 do // 设置256灰度的颜色表
begin
bmiColors.rgbBlue := xxxx;
bmiColors.rgbGreen := ...;
bmiColors.rgbRed := ...;
bmiColors.rgbReserved := 0;
end;
end;
bmp.handle := createdibsection(bmp.canvas.handle, bmpinfo, DIB_PAL_COLORS, bits, nil, 0);
move(你的裸数据的起始位置, bits^, length(你的裸数据)); // 将你的数据转入Tbitmap中.
end;

没试过.
 
DIB_PAL_COLORS好象应改为DIB_RGB_COLORS吧。
 
我的办法同上述诸位的见解。
 
to Another_eYes:
不行啊,一运行就异常退出了。
 
还有一个办法:
  用一个TMemoryStream,写入BMP文件的文件头和调色板等信息,再把你的
位图数据写进去,然后用TBitmap.LoadFromStream(MemoryStream)。说简单点
就是自己再内存中生成一个BMP文件,然后再载入TBitmap中。
 
to ZRY:
哈哈,我也是这样想的,而且成功了。Thanks!
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
后退
顶部