Perinteinen tehoste jossa kuva näyttä heijastuvan aaltoilevan veden pinnasta. Esittelee miten bittikarttaan voi piirtää nopeasti käyttämällä ScanLine ominaisuutta.
Binary: http://koti.mbnet.fi/~tommyr/files/aalto.zip (210 kt)
*** _main.dfm object Form1: TForm1 Left = 192 Top = 107 Width = 783 Height = 540 Caption = 'Form1' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText Font.Height = -11 Font.Name = 'MS Sans Serif' Font.Style = [] OldCreateOrder = False PixelsPerInch = 96 TextHeight = 13 object Image1: TImage Left = 8 Top = 40 Width = 375 Height = 198 AutoSize = True end object Button1: TButton Left = 8 Top = 8 Width = 75 Height = 25 Caption = 'Button1' TabOrder = 0 OnClick = Button1Click end object Timer1: TTimer Enabled = False Interval = 100 OnTimer = Timer1Timer Left = 88 Top = 8 end object OpenDialog1: TOpenDialog Left = 120 Top = 8 end end
*** _main.pas unit _main; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; const STRENGTH_X = 2.50; STRENGTH_Y = 2.50; type TForm1 = class(TForm) Image1: TImage; Timer1: TTimer; Button1: TButton; OpenDialog1: TOpenDialog; procedure Timer1Timer(Sender: TObject); procedure Button1Click(Sender: TObject); private procedure Wave; public { Public declarations } end; var Form1: TForm1; phase: Double; implementation {$R *.dfm} procedure TForm1.Wave; var pix_s,pix_t: PByteArray; x,y,nx,ny: Integer; buffer: TBitmap; begin // Luodaan piirtopuskuri buffer := TBitmap.Create; with Image1.Picture.Bitmap do begin // Asetetaan puskurin ominaisuudet buffer.Width := Width; buffer.Height := Height; buffer.PixelFormat := pf24bit; for y := 0 to Height-1 do begin // Pointteri puskuriin pix_t := buffer.ScanLine[y]; for x := 0 to Width-1 do begin // Lasketaan uudet koordinaatit nx := (Round(x+STRENGTH_X*sin((x+y)/5+phase))+Width) mod Width; ny := (Round(y+STRENGTH_Y*cos((x+y)/5+phase))+Height) mod Height; // Pointteri alkuperäiseen kuvaan; pix_s := ScanLine[Height-ny-1]; // Piirretään pixeli pix_t[x*3] := pix_s[nx*3]; //Sininen pix_t[x*3+1] := pix_s[nx*3+1]; //Vihreä pix_t[x*3+2] := pix_s[nx*3+2]; //Punainen end; end; // Blitataan puskuri formille BitBlt(Form1.Canvas.Handle,Image1.Left,Image1.Top+Image1.Height,Width,Height,buffer.Canvas.Handle,0,0,SRCCOPY); end; buffer.Free; end; procedure TForm1.Timer1Timer(Sender: TObject); begin Wave; // Siirretään aaltoja phase := phase+0.5; if phase > 2*Pi then phase := phase-2*Pi; end; procedure TForm1.Button1Click(Sender: TObject); begin if OpenDialog1.Execute then if UpperCase(ExtractFileExt(OpenDialog1.FileName)) = '.BMP' then begin Image1.Picture.LoadFromFile(OpenDialog1.FileName); // Varmistetaan että kuva on 24 bittinen Image1.Picture.Bitmap.PixelFormat := pf24bit; Timer1.Enabled := True; end else MessageDlg('Valitse BMP-tiedosto', mtError, [mbOk], 0); end; end.
Ei tuo exe ainakaan näytä aaltoilevan. Latasin siihen bmp kuvan vai pitääkö jotain muuta vielä tehdä?
Ohjelma näyttää kaksi kuvaa: alkuperäisen ja sen alapuolella aaltoilevan. Jos lataamasi kuva on iso, alempi kuva ei välttämättä näy ikkunan kokoa suurentamatta.
Oli tosiaan liian iso kuva. Nyt näkyy.
Kaunis efekti.
Todella hieno!
Aihe on jo aika vanha, joten et voi enää vastata siihen.