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.