TBitMap的pixelformat属性问题?兄弟等着救命。再加100献给图象高手。 (100分)

  • 主题发起人 主题发起人 jinmen
  • 开始时间 开始时间
J

jinmen

Unregistered / Unconfirmed
GUEST, unregistred user!
TBitMap的pixelformat属性值有pf8bit,pf24bit等,我的问题很简单pixelformat到底
是干什么用的,比如我有一幅24位的图象BMP进行了
BMP.pixelformat:=pf8bit;的操作,似乎什么也没有发生。
图象显示(比如Image1.picture.bitmap.assign(bmp))是否和pixelformat有关。分不是问题,
可以加。
 
pf8bit只有2^8种颜色,pf24bit有2^24种颜色,显示的效果是不一样的。
你找一幅色彩丰富的图试一下就知道了。
 
我问的是:Bmp是24bit图,BMP.pixelformat:=pf8bit;作用后到底在内存中起到一个什么变化。
下面这段程序很简单,可以直接运行。
procedure TForm1.Button1Click(Sender: TObject);
var
x,y : Integer;
BitMap : TBitMap;
P : PByteArray;
begin
BitMap := TBitMap.create;
try
BitMap:=TBitMap.Create;
BitMap.Height:=255;
BitMap.Width:=255;
BitMap.PixelFormat:=pf8bit; //BitMap.PixelFormat:=pf24bit;谁能解释这两条语句的不同效果
//满意就加分
for y := 0 to BitMap.Height -1 do
begin
P := BitMap.ScanLine[y];
for x := 0 to BitMap.Width -1 do
P[x] := y;
end;
Canvas.Draw(0,0,BitMap);
finally
BitMap.Free;
end;
end;
 
打开后,所用的内存不一样,如果要是做大图像处理,你一下就能明白了
 
=pf8bit 和 =pf24bit 的一个区别是 pf24bit 占用了 pf8bit 三倍的内存: 图像格式
不同,对于下面的语句来说,pf8bit的图可以处理整幅图,pf24bit就只能处理1/3的图了
for y := 0 to BitMap.Height -1 do
begin
P := BitMap.ScanLine[y];
for x := 0 to BitMap.Width -1 do
P[x] := y;
end;
你上面的程序如果运行起来就知道是怎么回事了
 
让事实说话吧:
1. 放一个TImage在form上
2. TImage中加载一幅很漂亮的真彩图, 请一定要找一幅漂亮的真彩风景画片, 否则你会得到(7)的结论。
3. 放一个button
4. Button.OnClick写:
Image1.Picture.Bitmap.PixelFormat := pf8Bit;
Image1.Refresh;
5. 运行
6. 如果视力上没有什么问题的话, 您已经知道PixelFormat是干吗的了。
7. 您仍不知道PixelFormat干吗用的。 我建议你做体检。
 
to other:大家没有明白我的问题,
to Another_eYes:
你好,这个程序我做的好多次了,图象有些变化,所以我才问
BMP.pixelformat:=pf8bit;到底发生了什么变化,说清楚一点,比如假设原来图象的宽度是
300,每个象素的位数用到24bit(在内存中就是3个字节),这样每一行实际应该有300×3字节,
经过上面的变换后每个象素就只有8位了,所以每一行应该有300个字节,内存实际应该是缩小了,
我想问在内存中这24bit采用什么规则变换成8bit,例取高位,取低位,求平均等等,我试验好像都不是,
想求一个明白。
还有,我上面贴的程序加个按钮就可以运行,很奇怪的是中间用了BitMap.PixelFormat:=pf8bit;
的程序,按照道理讲8bit图象是有256种颜色的灰度图象,可实际上颜色数很多,大家不妨运行一下,
这个问题困扰我很久了,我再加100分。
 
>> 按照道理讲8bit图象是有256种颜色的灰度图象
这可不对,8bit 图的颜色是根据调色板而定的,有可能是 256 色彩色图;

>> 24bit采用什么规则变换成8bit
至于这个问题,可看看 http://delphibbs.com/delphibbs/dispq.asp?lid=672480
 
24位的bmp他的颜色数据区域从第36H开始,而且是一个象素点三个字节,你可以用ultraedit
打开看看,改动这些数值,图象就会按照指定的颜色变化,但是8bit的位图他的颜色区域存储的
是一些颜色索引数值,用于在颜色查找表中查找相应的颜色值,你改动这些值其实只是指向了颜色表的
不同颜色,而非按照你的要求在变化,
 
to cqbaobao:你的回答正是我想要的,虽然比较难试验,我觉得是正确的。因为是卷兄答的,另
外100分我给卷兄了,希望你不要介意。
to huazai:颜色表我听了很多,一直不是很了解,能否介绍一下颜色表,比如颜色表的规定或实现
之类,我会另外开题给分的。
 
后退
顶部