调色板求教(50分)

  • 主题发起人 主题发起人 espite
  • 开始时间 开始时间
E

espite

Unregistered / Unconfirmed
GUEST, unregistred user!
请教:如何变换系统调色板或bmp图象的调色板但使得bmp图象
仍旧按照变换调色板以前的索引值在新的调色板中匹配颜色,
而非按照颜色就近匹配?
多谢!
 
为什么没人理我?是不是我没说清楚?
我的意思是:在图象处理中,进行了多幅图象显示(有前后
翻页)和幻灯显示。现在想通过响应一菜单条改变调色板,
从而使得应用程序中要显示的所有图象按照原来的图象数据
(16位索引值)到新的调色板中匹配颜色,而不是象系统目
前那样根据本身原来的颜色值在新调色板中就近匹配。
当然图象文件最好是bmp,但亦可改变。
好,这回说清楚了吧?
重赏之下必有勇夫!再加¥50。
 
100分真剌激,可惜我不懂.:)
 
//Randomly change a bitmap's palette Example
//Open a 256 colored Bitmap in Image1
//Add a TButton called Button1, caption = 'Random Palette'
//and its OnClick event as bellow
procedure TForm1.Button1Click(Sender: TObject);
var
pal: PLogPalette;
hpal: HPALETTE;
i: Integer;
begin
pal := nil;
try
GetMem(pal, sizeof(TLogPalette) + sizeof(TPaletteEntry) * 255);
pal.palVersion := $300;
pal.palNumEntries := 256;
for i := 0 to 255 do
begin
pal.palPalEntry.peRed := Random(255);
pal.palPalEntry.peGreen := Random(255);
pal.palPalEntry.peBlue := Random(255);
end;
hpal := CreatePalette(pal^);
if hpal <> 0 then
Image1.Picture.Bitmap.Palette := hpal;
finally
FreeMem(pal);
end;
end;
 
hui zhang给出的好象就是Delphi中bmp的范例。调色板是改变
了,但是bmp是根据本身原来的颜色值(RGB)在新调色板中就
近匹配的,而不是按照原来的图象数据(256色为16位索引值)
到新的调色板中匹配颜色。
 
procedure TForm1.Button1Click(Sender: TObject);
var
i,n:integer;
pal:arrar[0...255] of TPaletteEntry;{逻辑调色板}
begin
GetPaletteEntries(Image1.Pictrue.Bitmap.Palette,0,256,pal);
for i:=0 to 255 do
begin
pal[i].peFlags:=PC_RESERVED;
pal[i].peRed:=Random(255);
pal[i].peGreen:=Random(255);
pal[i].peBlue:=Random(255);
end;
SetPaletteEntries(Image1.Picture.Bitmap.Palette,0,256,pal);{设置新的颜色到DIB调色板}
RealizePalette(Image1.Picture.Bitmap.Canvas.Handle);{影
射逻辑调色板到系统硬件调色板}
end;
 
加上RealizePalette即可
 
espite:

这个问题已经很长时间没有人参加讨论,为保持版面
整洁,节约网友时间,请提问者采取必要处理措施。
关于图形图象版管理细则,请参见<a href="http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=111927">这个</a>问题。如两天
内提问者没有响应,我将采取强制措施。

如有管理建议,请到<a href="http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=111927">这里</a>提出。谢谢!
 
多人接受答案了。
 
好像并不能解决espite一开始提出的要求
 
后退
顶部