Autor Téma: Alpha  (Přečteno 665 krát)

(T)lama

  • Host
Alpha
« kdy: 11-01-2006, 11:20:00 »
Dobrý den,
 našel jsem článek o alpha vykreslování, ale já se ještě v tomto moc nevyznám. V příkladu byl použit obrázek o velikosti 50x50, ale já bych to potřeboval použít na obrázek o velikosti 800x600, ale tento algoritmus je na tak velký obrázek moc pomalý, a proto Vás prosím o zlepšení tohoto algoritmu nebo o jiný, rychlejší. Děkuji (Přikládám zdrojový kód toho příkladu)
 
Citace
Citovat:
unit MainUnit;

interface

uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  ExtCtrls, Buttons, StdCtrls, ComCtrls;

type
  TForm1 = class(TForm)
    SpeedButton1: TSpeedButton;
    C1Shape: TShape;
    C2Shape: TShape;
    C3Shape: TShape;
    Label1: TLabel;
    TrackBar1: TTrackBar;
    SourceImage: TImage;
    AlphaImage: TImage;
    SpeedButton2: TSpeedButton;
    FinishImage: TImage;
    Bevel1: TBevel;
    procedure SpeedButton1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure C1ShapeMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
    procedure TrackBar1Change(Sender: TObject);
    procedure SpeedButton2Click(Sender: TObject);
  private
    { Private declarations }
  public
   c1,c2,c3:TCOlor;
   Alpha:real;
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

procedure TForm1.SpeedButton1Click(Sender: TObject);
var r,g,b:integer;
begin
 // result = ALPHA * srcPixel + ( 1 - ALPHA ) * destPixel

 r:= Trunc(alpha * GetRValue(C1) + (1-alpha) * GetRValue(C2));
 g:= Trunc(alpha * GetGValue(C1) + (1-alpha) * GetGValue(C2));
 b:= Trunc(alpha * GetBValue(C1) + (1-alpha) * GetBValue(C2));

 c3:=RGB(r,g,b);

 // draw it !!!
 C1Shape.Brush.Color:=c1;
 C2Shape.Brush.Color:=c2;
 C3Shape.Brush.Color:=c3;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 c1:=clBlack;
 c2:=clWhite;

 Alpha:=0.5;

 Randomize;
end;

procedure TForm1.C1ShapeMouseUp(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
 // nastavení náhodné barvy...
 C1:=RGB(Random(255),Random(255),Random(255));
 C2:=RGB(Random(255),Random(255),Random(255));

 C1Shape.Brush.Color:=c1;
 C2Shape.Brush.Color:=c2;

end;

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
 Alpha:=TrackBar1.Position/100;

 Form1.SpeedButton1Click(nil);
end;

procedure TForm1.SpeedButton2Click(Sender: TObject);
var x,y,r,g,b:integer;
    cs,ca:TColor;
    Alfa:real;
begin
 FinishImage.Canvas.Pixels[0,0]:=Form1.Color;
 ca:=FinishImage.Canvas.Pixels[0,0];

 FinishImage.Width:=SourceImage.Width;
 FinishIMage.Height:=SourceImage.Height;

 Application.ProcessMessages;

 for x:= 0 to SourceImage.Width do
  begin
   for y:= 0 to SourceImage.Height do
    begin
     // když je černá, tak nemáme co počítat
     if AlphaImage.Canvas.Pixels[x,y] = clBlack then
      begin
       FinishImage.Canvas.pixels[x,y]:=ca;
      end
     // u bílé taky
     else if AlphaImage.Canvas.Pixels[x,y] = clWhite then
      begin
       FinishImage.Canvas.Pixels[x,y]:=SourceImage.Canvas.Pixels[x,y];
      end
     // a to ostatní musíme spočítat
     else
      begin
       // Alpha podle AlphaImage...    od 0 do 1
       Alfa:=GetGValue(AlphaImage.Canvas.Pixels[x,y])/255;

       cs:=SourceImage.Canvas.Pixels[x,y];

       r:= Trunc(alfa * GetRValue(Cs) + (1-alfa) * GetRValue(Ca));
       g:= Trunc(alfa * GetGValue(Cs) + (1-alfa) * GetGValue(Ca));
       b:= Trunc(alfa * GetBValue(Cs) + (1-alfa) * GetBValue(Ca));

       FinishImage.Canvas.Pixels[x,y]:=RGB(r,g,b);
      end;

     Application.ProcessMessages;

    end;
  end;
end;

end.


RomanZ

  • Host
Alpha
« Odpověď #1 kdy: 11-01-2006, 11:57:00 »
Jestli to mas na hry, doporucuju DirectX. Mrkni na http://www.afterwarp.net/, stahni si Asphyre eXtreme a za den se s tim naucis delat, je to parada.

(T)lama

  • Host
Alpha
« Odpověď #2 kdy: 11-01-2006, 13:10:00 »
Asphyre mám, ale tohle nebude hra

JaroB

  • Host
Alpha
« Odpověď #3 kdy: 11-01-2006, 14:47:59 »
tak zkus vygooglit něco jako "MMX Blend optimized"

(T)Lama

  • Host
Alpha
« Odpověď #4 kdy: 11-01-2006, 16:24:00 »
Zkusil jsem použít komponenty Graphics32 (g32.org). Kdyby někdo potřeboval použít alpha kanál s obrázek tak pak už jenom stačí:

 
Citace
Citovat:
procedure Thlavnifrm.FormCreate(Sender: TObject);
var
  B: TBitmapLayer;
  P: TPoint;
  Tmp: TBitmap32;
  W, H: Single;
  ImgAlpha: TImage32;
begin
B := TBitmapLayer.Create(vyslednyimg.Layers);
B.Bitmap.LoadFromFile(zdrojovyobrazek);
B.Bitmap.DrawMode := dmBlend;
ImgAlpha := TImage32.Create(Self);
Tmp := TBitmap32.Create;
  try
   ImgAlpha.Bitmap.LoadFromFile(obrazekalphakanalu);
   Tmp.SetSize(B.Bitmap.Width, B.Bitmap.Height);
   ImgAlpha.Bitmap.DrawTo(Tmp, Rect(0, 0, Tmp.Width, Tmp.Height));
   IntensityToAlpha(B.Bitmap, Tmp);
  finally
 Tmp.Free;
 ImgAlpha.Free;
 end;
vyslednyimg.Bitmap.Assign(B.Bitmap);
B.Free;
end;


Ale přišel jsem na to že můj problém je jinde, viz další téma