![]() |
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. ![]() ![]() ![]() Hier nun meine Umsetzung in Delphi:
Delphi-Quellcode:
Danke für Euer Interesse,
{-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-} mit freundlichen aus Nürnberg, Manfred |
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:
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...
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; |
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 13:14 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz