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