Nadesłany przez Tomasz Lubiński, 24 lutego 2009 01:00
Kod przedstawiony poniżej przedstawia główną część rozwiązania problemu.Pobierz pełne rozwiązanie.
Jeżeli nie odpowiada Ci sposób formatowania kodu przez autora skorzystaj z pretty printer'a i dostosuj go automatycznie do siebie.
3D Anaglify - Delphi/Anaglify.pas:
// Anaglify - tworzenie obrazow 3D // www.algorytm.org // (c) 2009 by Tomasz Lubinski unit Anaglify; interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls; type TForm1 = class(TForm) left: TImage; right: TImage; result: TImage; left_result: TImage; right_result: TImage; Label1: TLabel; Label2: TLabel; Label3: TLabel; Label4: TLabel; Label5: TLabel; GroupBox1: TGroupBox; Button1: TButton; method_ps: TRadioButton; method_psM: TRadioButton; method_dubois: TRadioButton; method_mono: TRadioButton; procedure Button1Click(Sender: TObject); private { Private declarations } public { Public declarations } end; PPixelRec = ^TPixelRec; TPixelRec = packed record B: Byte; G: Byte; R: Byte; Reserved: Byte; end; var Form1: TForm1; implementation {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); var r, g, b: Integer; i, j: Integer; lP, rP, lrP, rrP, P: PPixelRec; begin left.Picture.Bitmap.PixelFormat := pf32bit; right.Picture.Bitmap.PixelFormat := pf32bit; left_result.Canvas.Rectangle(0, 0, left_result.Width, left_result.Height); left_result.Picture.Bitmap.PixelFormat := pf32bit; right_result.Canvas.Rectangle(0, 0, right_result.Width, right_result.Height); right_result.Picture.Bitmap.PixelFormat := pf32bit; result.Canvas.Rectangle(0, 0, result.Width, result.Height); result.Picture.Bitmap.PixelFormat := pf32bit; for i:=0 to left.Picture.Bitmap.Height-1 do begin lP := left.Picture.Bitmap.ScanLine[i]; rP := right.Picture.Bitmap.ScanLine[i]; lrP := left_result.Picture.Bitmap.ScanLine[i]; rrP := right_result.Picture.Bitmap.ScanLine[i]; P := result.Picture.Bitmap.ScanLine[i]; for j:=0 to left.Picture.Bitmap.Width-1 do begin if (method_mono.Checked) then begin r := Round(lP.R*0.299 + lP.G*0.587 + lP.B*0.114); g := Round(rP.R*0.299 + rP.G*0.587 + rP.B*0.114); b := Round(rP.R*0.299 + rP.G*0.587 + rP.B*0.114); end else if (method_ps.Checked) then begin r := lP.R; g := rP.G; b := rP.B; end else if (method_psM.Checked) then begin r := Round(lP.R*0.299 + lP.G*0.587 + lP.B*0.114); g := rP.G; b := rP.B; end else begin r := Round(0.456100 * lP.R + 0.500484 * lP.G + 0.176381 * lP.B - 0.0434706 * rP.R - 0.0879388 * rP.G - 0.00155529 * rP.B); if (r > 255) then r := 255 else if (r < 0) then r := 0; g := Round(-0.0400822 * lP.R - 0.0378246 * lP.G - 0.0157589 * lP.B + 0.378476 * rP.R + 0.73364 * rP.G - 0.0184503 * rP.B); if (g > 255) then g := 255 else if (g < 0) then g := 0; b := Round(-0.0152161 * lP.R - 0.0205971 * lP.G - 0.00546856 * lP.B - 0.0721527 * rP.R - 0.112961 * rP.G + 1.2264 * rP.B); if (b > 255) then b := 255 else if (b < 0) then b := 0; end; // show result for left eye lrP.R := r; lrP.G := 0; lrP.B := 0; // show result for right eye rrP.R := 0; rrP.G := g; rrP.B := b; // show result for both eyes P.R := r; P.G := g; P.B := b; //next pixel Inc(lP); Inc(rP); Inc(lrP); Inc(rrP); Inc(P); end; end; end; end.