1,183
社区成员
发帖
与我相关
我的任务
分享
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Gdiplus, ActiveX, ExtCtrls;
type
TForm1 = class(TForm)
Timer1: TTimer;
procedure FormCreate(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FormPaint(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
private
{ Private declarations }
Index: Integer;
Count: Integer;
Images: array of TGpImage;
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
uses Math;
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
type
TARGBRect = packed record
Blue, Green, Red, Alpha: Byte;
end;
var
I, x, y: Integer;
W, H: Integer;
Image: TGpImage;
bkImage: TGpImage;
bmp: TGpBitmap;
bg: TGpGraphics;
GUID: TGUID;
ig: TGpGraphics;
Data: TBitmapData;
P: PInteger;
begin
DoubleBuffered := True;
// 打开图像文件
Image := TGpImage.Create('e:\0.gif');
W := Image.Width;
H := Image.Height;
BkImage := TGpImage.Create('e:\1.gif');
bmp := TGpBitmap.Create(W, H, pf32bppARGB);
bg := TGpGraphics.Create(bmp);
try
Image.GetFrameDimensionsList(@GUID, 1);
// 获取图像祯数
Count := Image.GetFrameCount(GUID);
SetLength(Images, Count);
for I := 0 to Count - 1 do
begin
Image.SelectActiveFrame(GUID, I);
bg.DrawImage(Image, 0, 0, W, H);
Data := bmp.LockBits(GpRect(0, 0, W, H), [imRead, imWrite], pf32bppARGB);
P := Data.Scan0;
for y := 1 to Data.Height do
for x := 1 to Data.Width do
begin
// 计算不透明度,三种方法都试了
with TARGBRect(P^) do
Alpha := Max(Red, Max(Green, Blue));
//Alpha := (Red + Green + Blue) div 3;
//Alpha := (306 * Red + 601 * Green + 117 * Blue) div 1024;
Inc(P);
end;
// 如果演示效果行,可以把Data.Scan0传递给你的那个函数m_pConfig.AddOverlay
bmp.UnlockBits(Data);
Images[I] := TGpBitmap.Create(W, H, pf32bppARGB);
ig := TGpGraphics.Create(Images[I]);
ig.DrawImage(BkImage, 0, 0, W, H);
ig.DrawImage(bmp, 0, 0, W, H);
ig.Free;
end;
finally
bg.Free;
bmp.Free;
BkImage.Free;
Image.Free;
end;
end;
procedure TForm1.FormDestroy(Sender: TObject);
var
I: Integer;
begin
for I := 0 to Count - 1 do
Images[I].Free;
end;
procedure TForm1.FormPaint(Sender: TObject);
var
g: TGpGraphics;
begin
g := TGpGraphics.Create(Canvas.Handle);
try
g.DrawImage(Images[Index], 0, 0);
finally
g.Free;
end;
end;
procedure TForm1.Timer1Timer(Sender: TObject);
begin
Inc(Index);
if Index = Count then
Index := 0;
Invalidate;
end;
end.