如何改变image的调色板并立刻显示改变的效果(100分)

  • 主题发起人 主题发起人 sw7309
  • 开始时间 开始时间
S

sw7309

Unregistered / Unconfirmed
GUEST, unregistred user!
我用如下代码想改变imgScan.picture.bitmap的调色板:
Pal.lPal.palVersion :=$300; //version of palette
Pal.lPal.palNumEntries :=256; //color sum of palette
GetPaletteEntries(ImgScan.Picture.BitMap.Palette,0,256,Pal.ColorEntry);
for i:=0 to 255 do
begin
Pal.ColorEntry[iColorIndex].peRed := 0;
Pal.ColorEntry[iColorIndex].peGreen := 0;
Pal.ColorEntry[iColorIndex].peBlue := 0;
end;
imgScan.Picture.Bitmap.Palette := CreatePalette(Pal.lPal);
invalidate();
但是发现改变的效果总是不显示,请各们高手会诊?
pal的声明如下:
LogPal = record //logical palette
lPal : TLogPalette;
ColorEntry:Array[0..255] of TPaletteEntry;
end;
pal : LogPal;

 
要Getmem给lpLogPal!
begin
BitMap := TBitMap.create;
Bitmap.Width:=form1.Width;
Bitmap.Height:=form1.Height;
Bitmap.PixelFormat:= pf8bit;
// randomize;
GetMem(lpLogPal,sizeof(TLOGPALETTE) + ((255) * sizeof(TPALETTEENTRY)));
lpLogPal.palVersion := $0300; //the current palette version
lpLogPal.palNumEntries := 256;
for x := 0 to 255 do
begin
lpLogPal.palPalEntry[x].peRed := 255;//x*23;//ûÎÊÌâÁË£¡
lpLogPal.palPalEntry[x].peGreen :=x;
lpLogPal.palPalEntry[x].peBlue := random(127);
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( (y*x));//ÕâÀï²»ÀàÐÍת»»Ò»ÏÂÒ²»áRange Checking´í
end;
canvas.draw(0,0,BitMap);//form.canvas, just for a look:)
end;

 
先谢谢huazai,但似乎你的答案并不适合我的问题,在我的程序中pal已经是声明的
变量了,有了它的内存空间,为什么还要GetMem,另外,我的意思是要对一幅已经显示的
图象(显示在imgScan中)的调色板进行修改,然后要立即显示修改后的效果,请帮忙
再考虑一下。
谢谢!
 
改变调板后将其拷贝到另一image中后再显示出来中否或者将其存盘后再调入。
 
谢谢windbell,这个方法我知道,但我的目的是想让imgScan中有特定颜色闪烁,这样的话最好就是通过修改
这种颜色的调色板数据来达到这一目的,我目前的环境是win2000,1024*768,32位色,在这样的情况下,
修改256色图像的调色板应该没有问题,请各位高手会诊。
分不够可以说。
谢谢
 
没有问题呀,确定你的图象是 256 色的:)
 
我的图象是256色的,但总是看不到改变后的效果,请各位帮忙了
 
如果有高手知道在C++中如何做,也可以贴出来,如果正确,一样给分
 
把你的环境由“环境是win2000,1024*768,32位色”
切换到
“环境是win2000,1024*768,256色”
 
procedure TForm1.Timer1Timer(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 256 do
begin
pal.palPalEntry.peRed := 100;
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;
 
后退
顶部