在DELPHI中如何创建bmp文件?(200分)

E

espite

Unregistered / Unconfirmed
GUEST, unregistred user!
请教各位客官,as title.其中我不清楚如何在系统调色板
为16位增强色或32位真彩色的情况下设置bmp文件的调色板
为通常的256色(调色板RGB应如何设置),另外bmp文件的
图象数据与调色板的关系,是只需给出在调色板中的索引值
吗?索引值是从0还是从1开始,对应的是0。。255或1。。
256吗?
 
yourBMPObject.PixelFormat:=pf8bit;
 
我的意思是先创建一个文件,然后把数据以bmp文件
的格式写入。因此要写的是数据。阁下对对象域操作
的方法可能不行。
 
可是你的bmp数据从哪里来呢?
如果也是一个bmp,就把它装入一个
image的Picture属性中的Bitmap(属性),
然后用TPicture的savetofile岂不是简单?
 
在Windows的显示模式中,只有256色模式是基于调色板的,这种模式是多媒体程序经
常采用的。在基于调色板的256色模式下,当一幅图像显示时,Windows把图像的逻辑调色板载入,并通过调色板映射把逻辑调色板映射到系统调色板,图像的每一像素的显示颜色都映射自系统调色板的一个颜色索引值,每个索引对应一个24位的RGB全彩色值。当系统调色板改变时,当前引用系统调色板的窗口的像素颜色也随之改变,而这种改变是系统在硬件刷屏中自动完成的,速度极快,
 
请参考本论坛中"Tbitmap初始化"这个问题的讨论。
 
256色BMP图像数据部分使用调色板中的索引值,从0到$ff(255).
256色图像的RGB数据一般都是不一样的,如果一定要找到通用的话,
好像以前的Turbo Pascal 5.5 的Graphic帮助中有介绍,大约前16
色为标准16色,后面有一些灰度色.我想可以先初始化为256色,然后用
GetRGBPalette(number,R,G,B)获取
 
创建256色位图的调色板时,要先定义版本号及色彩数,然后对于每一个调色板
的Entry,赋予R,G,B值。在位图的数据中,只需给出对应调色板的索引值,从0
到255。
看看下面的例子。
procedure TForm1.Button1Click(Sender: TObject);
var
x,y : integer;
BitMap : TBitMap;
lplogpal:pMaxLogPalette;//pointer of TMaxLogPalette
p:pByteArray;
begin
BitMap := TBitMap.create;
Bitmap.Width:=256;
Bitmap.Height:=256;
Bitmap.PixelFormat:= pf8bit;
GetMem(lpLogPal,sizeof(TLOGPALETTE) + ((255) * sizeof(TPALETTEENTRY)));
lpLogPal.palVersion := $0300;
lpLogPal.palNumEntries := 256;
for x := 0 to 255 do
begin
lpLogPal.palPalEntry[x].peRed := x;
lpLogPal.palPalEntry[x].peGreen := x;
lpLogPal.palPalEntry[x].peBlue := x;
end;
Bitmap.Palette := CreatePalette(pLogPalette(lpLogPal)^);
FreeMem(lpLogPal,sizeof(TLOGPALETTE) + ((255) * sizeof(TPALETTEENTRY)));
for y := 0 to BitMap.Height -1 do
begin
P := BitMap.ScanLine[y];
for x := 0 to BitMap.Width -1 do
P[x] := Byte(x*y);
end;
canvas.draw(0,0,BitMap);//form.canvas, just for a look:)
end;

这里好像已经回答了espite的所有疑问啦。
 
谢谢各位。我已明白BMP的图象数据的情况。关于调色板还是
不清楚。我是从外部读取数据,然后写BMP文件。调色板希望
按照由冷色到暖色变化,不知道应如何给调色板的以下部分赋
值。
for x := 0 to 255 do
begin
lpLogPal.palPalEntry[x].peRed := x;//此处X应为何值。
lpLogPal.palPalEntry[x].peGreen := x;
lpLogPal.palPalEntry[x].peBlue := x;
end;
而tqz给出的好象只有灰度值,而非彩色。
 
我的例子中
lpLogPal.palPalEntry[x].peRed := x;
lpLogPal.palPalEntry[x].peGreen := x;
lpLogPal.palPalEntry[x].peBlue := x;
三个分量是一样的,当然变成灰度啦。如果RGB分量变化此消彼长的话,调色板
颜色变化不就出来了?我不知道冷色到暖色变化,RGB分量如何调整。如果你知道,
那就完全可以均匀分配到256个Entry中。
 
谢谢tqz.一方面我不知道256色时RGB分量该怎样变化,另一方面,
我只知道red是暖色,BLUE是冷色,也不知道RED、BLUE、GREEN
应如何变化才能实现由冷色到暖色变化。
 
呵呵, 如何设置调色板, 要看您的外部数据啦!

如果原始数据是真彩色的, (比如从扫描仪来), 那么您需要一种
算法来寻找一种优化的调色板.比如, 把原始图像所占据的颜色
空间剖分成256个互不相交的子空间的并集, 每个子空间选取一
个点的颜色值, 该子空间的其他点的颜色值都取为该点的值.
划分的依据可以是均方差最小, 或者其他的某个函数的极值.

如果是想做"可视计算", 即把某种抽象的东西形象化, 那么调色
板就可以按照喜好制定啦

(哇!, 一个上午网络都不通, 我的意见挂起了几个小时才发出去,
不知又有多少问题被天下英雄给瓜分, 蚕食了. 这下咱没戏了, :)

 
呵呵, 现在通了, 如果您想根据色调设置颜色的话, 那就不要使
用RGB方式, 使用HSB方式 (Hue, Saturation, Brightness) 设置, 然
后利用转换公式变换到RGB格式较好.

请参考有关颜色理论方面的专著吧
 
谢谢pegasus.我作的不是图象处理,只是从A/D读
数据,然后用颜色表示。但需要颜色连续变化(BLACK-
BLUE-RED-WHITE)。不知道算法如何?
 
是象彩虹那样吗?
那就要用HLS来表示颜色(上面我讲的HSB不确切, 应为
HLS: Hue, Lumen, Saturation),
颜色Hue从190渐变到0
饱和度Saturation不妨取最大值240
亮度则配合颜色从黑到白由0渐变到240

可是糟糕的是, 我忘记了HLS到RGB的转换公式, :(~~~
而且我的书放在较远的公司宿舍里, 如果你找不到公式,的话,
再发个消息, 我可以去查一查.
 
谢谢pegasus,问题我已解决。您的方法我
会再试。
 
顶部