// Die ganze Sache ist mehr ein Gag als richtige Einfärbung.
// Vor Einführung des Farb-Fernsehens (am 25. August 1967)
// gab es tatsächlich blau/grün/braun gefärbte Folien, die man
// vor den Bildschirm klebte, um so die Illusion von farblichem
// Sehen zu erzeugen. Der folgende Code bildet das einfach nach.


// Getestet mit D2010 unter Win7


 

procedure SWColor(Src, Dst: TBitmap); 
var 
  Hlp: TBitmap; 
  P1, P2: PByteArray; 
  X, Y, B3: Integer; 
  B: Byte; 
  procedure vorbereitung(bm: TBitmap); 
  begin 
    with bm do 
    begin 
      Width := Src.Width; 
      Height := Src.Height; 
      PixelFormat := pf24Bit; 
    end; 
  end; 
  procedure Verlauf(cv: TCanvas; Rect: TRect; C: Array of TColor); 
  type 
    RgbArray = Array [0 .. 2] of Byte; 
  var 
    X, Y, Z, Stelle, Mx, Bis, Fach, Mass: Integer; 
    Faktor: double; 
    A: RgbArray; 
    B: Array of RgbArray; 
  begin 
    Mx := high(C); 
    Mass := Rect.bottom - Rect.top; 
    setlength(B, Mx + 1); 
    for X := 0 to Mx do 
    begin 
      C[X] := colortorgb(C[X]); 
      B[X][0] := getrvalue(C[X]); 
      B[X][1] := getgvalue(C[X]); 
      B[X][2] := getbvalue(C[X]); 
    end; 
    cv.Pen.Width := 1; 
    cv.Pen.Style := psSolid; 
    Fach := round(Mass / Mx); 
    for Y := 0 to Mx - 1 do 
    begin 
      if Y = Mx - 1 then 
        Bis := Mass - Y * Fach - 1 
      else 
        Bis := Fach; 
      for X := 0 to Bis do 
      begin 
        Stelle := X + Y * Fach; 
        if Bis = 0 then 
          Faktor := 1 
        else 
          Faktor := X / Bis; 
        for Z := 0 to 2 do 
          A[Z] := Trunc(B[Y][Z] + ((B[Y + 1][Z] - B[Y][Z]) * Faktor)); 
        cv.Pen.Color := RGB(A[0], A[1], A[2]); 
        cv.MoveTo(Rect.left, Rect.top + Stelle); 
        cv.LineTo(Rect.right, Rect.top + Stelle); 
      end; 
    end; 
    B := nil; 
  end; 
 
begin 
  B3 := Src.Width * 3; 
  Hlp := TBitmap.Create; 
  vorbereitung(Dst); 
  vorbereitung(Hlp); 
  Dst.Canvas.Draw(0, 0, Src); 
  Verlauf(Hlp.Canvas, Hlp.Canvas.ClipRect, [clBlue, $33FF00, clMaroon]); 
  for Y := 0 to Dst.Height - 1 do 
  begin 
    X := 0; 
    P1 := Dst.ScanLine[Y]; 
    P2 := Hlp.ScanLine[Y]; 
    while X < B3 do 
    begin 
      B := Trunc(P1[X] * 0.11 + P1[X + 1] * 0.59 + P1[X + 2] * 0.3); 
      P1[X] := (B * 2 + P2[X]) div 3; 
      P1[X + 1] := (B * 2 + P2[X + 1]) div 3; 
      P1[X + 2] := (B * 2 + P2[X + 2]) div 3; 
      inc(X, 3); 
    end; 
  end; 
  Hlp.Free; 
end; 
 
 
 
// Beispiel für zwei Images, in denen JPegs sind 
 
procedure TForm2.Button1Click(Sender: TObject); 
var 
  bmp1: TBitmap; 
  bmp2: TBitmap; 
begin 
  bmp1 := TBitmap.Create; 
  bmp2 := TBitmap.Create; 
  bmp1.Assign(Image1.Picture.Graphic); 
  SWColor(bmp1, bmp2); 
  Canvas.Draw(Image1.BoundsRect.right + 2, Image1.top, bmp2); 
  bmp1.Assign(Image2.Picture.Graphic); 
  SWColor(bmp1, bmp2); 
  Canvas.Draw(Image2.BoundsRect.right + 2, Image2.top, bmp2); 
  bmp2.Free; 
  bmp1.Free; 
end; 

 


 

Zugriffe seit 6.9.2001 auf Delphi-Ecke