Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Sepia laut Microsoft (https://www.delphipraxis.net/166974-sepia-laut-microsoft.html)

mz23 8. Mär 2012 06:41

Sepia laut Microsoft
 
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

s.h.a.r.k 8. Mär 2012 07:19

AW: Sepia laut Microsoft
 
Kleiner Tipp am Rande: wie wäre es wenn du ein Enum-Typ einführst, dann machst du es jedem leichter den Code zu verwenden bzw. diesen zu lesen. Denn mit der folgenden Lösung brauchst du dir nicht jedes mal den Parameter anschauen und brauchst nicht zu überlegen, was True und False wirklich bewirken:
Delphi-Quellcode:
type
  TBitmapConversion = (bcGray, bcSepia);

procedure TImageEdit._ColorTransformation(const ABitmapConversion: TBitmapConversion);
begin
  { ... }
end;

procedure TImageEdit.bGrayClick(Sender: TObject);
begin
  _ColorTransformation(bcGray);
end;

procedure TImageEdit.bSepiaClick(Sender: TObject);
begin
  _ColorTransformation(bcSepia);
end;
Je nachdem, welche Delphi-Version man denn nutzt, könnte man auch einen class helper daraus stricken, oder eine allgemeine Methode, die ein TImage oder TBitmap übergeben bekommt und darauf arbeitet...

mz23 9. Mär 2012 14:53

AW: Sepia laut Microsoft
 
Danke. Das ist richtig.

PS: Werde mich doch nicht mit einem Hai anlegen :)


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:13 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz