256色下调色板淡入淡出闪烁如何解决?(100分)

  • 主题发起人 主题发起人 luhao
  • 开始时间 开始时间
L

luhao

Unregistered / Unconfirmed
GUEST, unregistred user!
网上有篇子256色模式下用修改调色板的办法实现高速淡入淡出的文章,可是完全按其
运行却有问题:调色板修改后,屏幕上的TIMAGE的颜色变化并为体现出来,除非
加一条timage.refresh或者tform.refresh才行,可是这样一来,我在频繁更新调色板
时,就会导致图片画面闪烁,该怎么解决呢?
 
try these code:

{ Put a TImage and load a bitmap of 24 bits
or 32 bits; put a TButton and put this
code in its OnClick event }

procedure TForm1.Button1Click(Sender: TObject);
procedure FadeOut(const BMP:TImage; Pause:integer);
var
BytesPorScan: integer;
w,h: integer;
p: pByteArray;
counter: integer;
begin
{ This only works with 24 or 32 bits bitmaps }

If Not (BMP.Picture.Bitmap.PixelFormat in [pf24Bit, pf32Bit])
then raise exception.create('Error, bitmap format not supported.');

try
BytesPorScan := Abs ( Integer(BMP.Picture.Bitmap.ScanLine[1])-
Integer(BMP.Picture.Bitmap.ScanLine[0]));
except
raise exception.create('Error');
end;

{ Decrease the RGB components of each single pixel }
for counter := 1 to 256 do
begin
for h := 0 to BMP.Picture.Bitmap.Height - 1 do
begin
P := BMP.Picture.Bitmap.ScanLine[h];
for w := 0 to BytesPorScan - 1 do
if P^[w] >0 then P^[w] := P^[w]-1;
end;
Sleep(Pause);
BMP.Refresh;
end;
end; {procedure FadeOut}

begin
FadeOut(Image1, 5);
end;
 
谢谢!但是很抱歉,
这种24bit的bitmap+scanline的方法我已经用了,就是速度不够我才考虑用调色板
方法的,因为我要实现1024*768甚至更高分辨率下图像的余辉的效果,让屏幕上的某
种颜色不停地变淡直至消失。

有哪位对调色板操作比较熟的?
 
应该对位图进行操作,为位图创建适当的调色板。
 
JohnsonGuo同学能说清楚点么?

另,有没办法对FORM的CANVAS使用SCANLINE函数?
 
应该使用双缓冲技术。在内部建立一个位图,
所有绘制操作对位图进行处理(包括更改调色板操作)。
在适当的时候把位图绘制到适当的控件上。

ScanLine只对TBitmap在效。
 
后退
顶部