Эффект плавного перехода

...существует ли для этого эффекта какой-либо алгоритм генерации изображений вместо использования кисточки?
Я был скептически настроен к механизму использования кистей, чтобы получить что-либо похожее на эффект перехода/ухода ("fade") по сравнению со стеркой ("wipe"), но вчера вечером я нашел следующее решение, которое делает невероятное - осуществляет плавный переход от одного изображения к другому:
procedure WaitAWhile(n: LongInt);
var
 StartTime: LongInt;
begin
 StartTime := TimeGetTime;
 while TimeGetTime < StartTime + n do
 Sleep(1);
end;
procedure TForm1.Image1Click(Sender: TObject);
var
 BrushBmp, BufferBmp, Buffer2Bmp, ImageBmp, Image2Bmp: TBitmap;
 j, k, row, col: LongInt;
begin
 row := 0;
 col := 0;
 BrushBmp := TBitmap.Create;
 with BrushBmp do
 begin
 Monochrome := False;
 Width := 8;
 Height := 8;
 end;
 imageBmp := TBitmap.Create;
 imagebmp.LoadFromFile('c:\huh.bmp');
 image2bmp := TBitmap.Create;
 image2bmp.LoadFromFile('c:\whatsis.bmp');
 { При 256 цветах лучше иметь ту же самую палитру! }
 BufferBmp := TBitmap.Create;
 with BufferBmp do
 begin
 Height := 200;
 Width := 200;
 canvas.brush.bitmap := TBitmap.Create;
 end;
 Buffer2Bmp := TBitmap.Create;
 with Buffer2Bmp do
 begin
 Height := 200;
 Width := 200;
 Canvas.Brush.Bitmap := TBitmap.Create;
 end;
 for k := 1 to 16 do
 begin
 WaitAWhile(0); { Для пентиума необходимо добавить задержку }
 for j := 0 to 3 do
 begin
 row := (row + 5) mod 8;
 col := (col + 1) mod 8;
 if row = 0 then
 col := (col + 1) mod 8;
 BrushBmp.canvas.Pixels[row, col] := clBlack;
 end;
 with BufferBmp.Canvas do
 begin
 Copymode := cmSrcCopy;
 Brush.Bitmap.Free;
 Brush.Style := bsClear;
 Brush.Bitmap := TBitmap.Create;
 Brush.Bitmap.Assign(BrushBmp);
 Rectangle(0, 0, 200, 200);
 CopyMode := cmMergeCopy;
 CopyRect(Rect(0, 0, 200, 200), ImageBmp.Canvas,
 Rect(0, 0, 200, 200));
 end;
 with Buffer2Bmp.Canvas do
 begin
 CopyMode := cmSrcCopy;
 Brush.Bitmap.Free;
 Brush.Style := bsClear;
 Brush.Bitmap := TBitmap.Create;
 Brush.Bitmap.Assign(BrushBmp);
 Rectangle(0, 0, 200, 200);
 CopyMode := cmSrcErase;
 CopyRect(Rect(0, 0, 200, 200), Image2Bmp.Canvas,
 Rect(0, 0, 200, 200));
 end;
 BufferBmp.Canvas.CopyMode := cmSrcPaint;
 BufferBmp.Canvas.Copyrect(Rect(0, 0, 200, 200),
 Buffer2Bmp.Canvas, Rect(0, 0, 200, 200));
 Canvas.CopyMode := cmSrcCopy;
 Canvas.CopyRect(Rect(0, 0, 200, 200), BufferBmp.Canvas,
 Rect(0, 0, 200, 200));
 end;
 BufferBmp.Canvas.Brush.Bitmap.Free;
 Buffer2Bmp.Canvas.Brush.Bitmap.Free;
 BrushBmp.Free;
 BufferBmp.Free;
 Buffer2Bmp.Free;
 ImageBmp.Free;
 Image2Bmp.Free;
end;
Комментарии: На Pentium I я реально использую 64 кисточки, изменив приведенные выше строки на следующие:
for k := 1 to 64 do
begin
 WaitAWhile(50);
 for j:=0 to 0 do
При организации указанной задержки возможно получение плавного перехода.
Заполняя кисть в другом порядке, вы можете получить ряд других эффектов, но приведенная выше версия единственная, которую мне удалось получить максимально похожей на эффект перехода, но вы можете, скажем, написать:
begin
 row := (row+1) mod 8;
 {col := (col+1) mod 8;}
 if row = 0 then
 col := (col+1) mod 8;
и получить своего рода эффект перехода типа "venetian-blind wipe" (дословно - стерка венецианского хрусталя).
Вопрос: Я чувствую, что я делаю что-то неправильно, существует какая-то хитрость с кистью. Мне нужно все четыре строчки:
Canvas.Brush.Bitmap.Free;
Canvas.Brush.Style := bsClear;
Canvas.Brush.Bitmap := TBitmap.Create;
Canvas.Brush.Bitmap.Assign(BrushBmp);
чтобы все работало правильно; но я совсем не понимаю, почему первые три строки являются обязательными, но если я их выкидываю, Assign срабатывает только один раз(!?!?!). Это реально работает? Есть способ другого быстрого назначения Brush.Bitmap? (В документации в качестве примера указано на Brush.Bitmap.LoadFromFile, но должно быть лучшее решение. Хорошо, допустим приведенный способ лучший, но он кажется неправильным...)
Author: David C. Ullrich 
Source: http://delphiworld.narod.ru
ID: 03894
Category:Графика
Category:Bitmap