AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Sepia laut Microsoft

Ein Thema von mz23 · begonnen am 8. Mär 2012 · letzter Beitrag vom 9. Mär 2012
Antwort Antwort
mz23
(Gast)

n/a Beiträge
 
#1

Sepia laut Microsoft

  Alt 8. Mär 2012, 07: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
Benutzerbild von s.h.a.r.k
s.h.a.r.k

Registriert seit: 26. Mai 2004
3.159 Beiträge
 
#2

AW: Sepia laut Microsoft

  Alt 8. Mär 2012, 08:19
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...
»Remember, the future maintainer is the person you should be writing code for, not the compiler.« (Nick Hodges)
  Mit Zitat antworten Zitat
mz23
(Gast)

n/a Beiträge
 
#3

AW: Sepia laut Microsoft

  Alt 9. Mär 2012, 15:53
Danke. Das ist richtig.

PS: Werde mich doch nicht mit einem Hai anlegen
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 18:21 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