Einzelnen Beitrag anzeigen

mz23
(Gast)

n/a Beiträge
 
#1

Sepia laut Microsoft

  Alt 8. Mär 2012, 06:41
Guten Morgen liebe DP-Gemeinde,

nachdem es einfach war, die Information zu finden um
einen TColor Wert nach Graustufe umzuwandeln, so gab
es doch verschiedene Lösungen, wenn es um Sepia ging.

Da war von verschiedenen Tiefen die Rede, die die RGB
Werte zu durchlaufen hatten. Mein Problem damit war nun,
daß jeder seine "Tiefe" selbst bestimmen konnte.

D.h. ein Bild konnte verschieden aussehen, je nachdem,
welcher Programmierer sein "Sepia" erzeugte.

Dann fand ich eine Seite, wo stand, wie Microsoft das
"Problem" mit Sepia löst.

http://www.efg2.com/Lab/Library/Delp...Algorithms.htm
http://www.efg2.com/Lab/Library/Delp...Processing.htm
http://www.efg2.com/Lab/Library/Delp...hics/Color.htm

Hier nun meine Umsetzung in Delphi:

Delphi-Quellcode:
{-calc loaded Bitmap in TImage_Picture to GrayScale Or Sepia-}
{-by M.Z. March 8, 2012-}


procedure TImageEdit._makeGrayOrSepia(IsGray: boolean);
var c: longint;
    r, g, b : byte;
    rr, gg, bb: integer;
    dx, dy, h, w: integer;
begin
dx:=imaDest.Width;
dy:=imaDest.Height;
for h:=0 to dy-1 do begin
    for w:=0 to dx-1 do begin
        c:=ColorToRGB(imaDest.Canvas.Pixels[w,h]);
        r:=getRvalue(c);
        g:=getGvalue(c);
        b:=getBvalue(c);
        if isGray then begin
           {-note: with Trunc() we calc values always <= 255-}
           c:=Trunc((b * 0.110) + (g * 0.590) + (r * 0.300));
           imaDest.canvas.Pixels[w,h]:=RGB(c,c,c);
        end else begin
           {-note: rr, gg, bb must be integer for correct results-}
           rr:=Round((r * 0.393) + (g * 0.769) + (b * 0.189));
           gg:=Round((r * 0.349) + (g * 0.686) + (b * 0.168));
           bb:=Round((r * 0.272) + (g * 0.534) + (b * 0.131));
           if (rr > 255) then rr:=255;
           if (gg > 255) then gg:=255;
           if (bb > 255) then bb:=255;
           imaDest.Canvas.Pixels[w,h]:=RGB(rr,gg,bb);
        end;
    end; {for w}
  end; {for h}
end;

procedure TImageEdit.bGrayClick(Sender: TObject);
begin
_makeGrayOrSepia(True);
end;

procedure TImageEdit.bSepiaClick(Sender: TObject);
begin
_makeGrayOrSepia(False);
end;

{-we need: ImageEdit: TForm-}
{-         bGray, bSepia: TButton-}
{          imaDest: TImage-}
Danke für Euer Interesse,
mit freundlichen aus Nürnberg,
Manfred
  Mit Zitat antworten Zitat