Q&A

  • 이미지절환효과를 내려면 어떻게 해야하나요?
안녕하세요.
이미지를 순서대로 열람하게 하려는데 책페지를 넘기는 효과나 페지롤링효과같은걸 내려면 어떻게 해야하는지요?
여기서 단순한 절환효과를 내는 소스를 본 기억이 있는데 찾을수가 없네요.
2  COMMENTS
  • Profile
    홍성락 2008.08.13 06:51
    다른 방법도 있겠는데요
    오래전에 올리긴 했었는데요, OpenGL로 간단히 만든겁니다
    부드럽게 하려면 수학 공식을 더 사용하면 할 수 도 있겠지요...더 만드시면 올려주세요

    target=_blank>http://www.delphi.co.kr/zboard/view.php?id=component&page=1&sn1=on&divpage=1&sn=on&ss=off&sc=off&keyword=홍성락&select_arrange=headnum&desc=asc&no=1652


  • Profile
    steps 2008.08.14 23:13
    이미 프로젝트에서 리용하고있던 graphics32에 있는 데모를 고쳐서 대충 테스트해봤는데 큰 오류는 없는것 같습니다.
    <!--CodeS-->
    TForm1 = class(TForm)
    Src: TImage32;
    Dst: TImage32;
    btn1: TButton;
    procedure FormCreate(Sender: TObject);
    procedure FormDestroy(Sender: TObject);
    procedure btn1Click(Sender: TObject);
    protected
    public
    PT: TProjectiveTransformation;
    TT: TTransformation;
    Vertices: array[0..3] of TPoint;
    procedure DoTransform;
    procedure GenTransform;
    procedure PrepareSource;
    procedure InitVertices; // for projective mapping
    end;

    var
    Form1: TForm1;

    implementation

    {$R *.DFM}

    procedure TForm1.FormCreate(Sender: TObject);
    begin
    Dst.SetupBitmap; // set the destination bitmap size to match the image size
    PrepareSource;
    PT := TProjectiveTransformation.Create;
    TT := PT;
    InitVertices;
    DoTransform;
    end;

    procedure TForm1.PrepareSource;
    begin
    // make the border pixels transparent while keeping their RGB components
    SetBorderTransparent(Src.Bitmap,
    Rect(0, 0, Src.Bitmap.Width - 1, Src.Bitmap.Height - 1));
    end;

    procedure TForm1.DoTransform;
    var
    i, j: Integer;
    P: PColor32;
    begin
    Application.ProcessMessages;
    GenTransform;
    Dst.BeginUpdate;

    // Fill Dst with checkerboard pattern
    P := Dst.Bitmap.PixelPtr[0, 0];
    for j := 0 to Dst.Bitmap.Height - 1 do
    for i := 0 to Dst.Bitmap.Width - 1 do
    begin
    if Odd(i shr 4) = Odd(j shr 4) then P^ := clGray32
    else P^ := clWhite32;
    Inc(P);
    end;

    Transform(Dst.Bitmap, Src.Bitmap, TT);
    Dst.EndUpdate;
    Dst.Repaint;
    end;

    procedure TForm1.GenTransform;
    begin
    TT.SrcRect := FloatRect(0, 0, Src.Bitmap.Width - 1, Src.Bitmap.Height - 1);
    begin
    PT.X0 := Vertices[0].X; PT.Y0 := Vertices[0].Y;
    PT.X1 := Vertices[1].X; PT.Y1 := Vertices[1].Y;
    PT.X2 := Vertices[2].X; PT.Y2 := Vertices[2].Y;
    PT.X3 := Vertices[3].X; PT.Y3 := Vertices[3].Y;
    end;
    end;

    procedure TForm1.FormDestroy(Sender: TObject);
    begin
    PT.Free;
    end;

    procedure TForm1.InitVertices;
    begin
    Vertices[0].X := 0;
    Vertices[0].Y := 50;
    Vertices[1].X := Src.Bitmap.Width - 1;
    Vertices[1].Y := 50;
    Vertices[2].X := Src.Bitmap.Width - 1;
    Vertices[2].Y := Src.Bitmap.Height - 1 + 50;
    Vertices[3].X := 0;
    Vertices[3].Y := Src.Bitmap.Height - 1 + 50;
    end;

    procedure TForm1.btn1Click(Sender: TObject);
    var i, w, h : Integer;
    al : single;
    begin
    w := src.Bitmap.Width;
    h := src.Bitmap.Height;
    for i := 0 to 45 do
    begin
    al := 3.14 * i / 90;
    Vertices[1].X := Trunc(w * Cos(al));
    Vertices[1].Y := -Trunc(0.4 * w * Sin(al)) + 50;
    Vertices[2].X := Trunc(w * Cos(al));
    Vertices[2].Y := -Trunc(0.4 * w * Sin(al)) + h + 50;
    DoTransform;
    Sleep(20);
    end;

    end;
    <!--CodeE-->