AGB  ·  Datenschutz  ·  Impressum  







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

Bitmap schärfen

Ein Thema von barese · begonnen am 24. Apr 2011 · letzter Beitrag vom 29. Apr 2011
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von barese
barese

Registriert seit: 27. Nov 2009
Ort: Berlin
35 Beiträge
 
Delphi 11 Alexandria
 
#1

Bitmap schärfen

  Alt 24. Apr 2011, 11:17
Hallo Coders.!
Ich tappe wieder im dunkel und such das Licht.

Möchte mit der Procedur ein Bitmap in einer TImage schärfen.
Lässt sich auch compilieren, aber ich hab es nicht geschaft es anzuwenden. Hoffe ihr habt da vieleicht ne idee..!

Delphi-Quellcode:
...

uses jpeg

...

procedure Sharpen(sbm, tbm: TBitmap; alpha: Single);
var
  i, j, k: integer;
  sr: array[0..2] of PByte;
  st: array[0..4] of pRGBTriple;
  tr: PByte;
  tt, p: pRGBTriple;
  beta: Single;
  inta, intb: integer;
  bmh, bmw: integer;
  re, gr, bl: integer;
  BytesPerScanline: integer;

begin
  Assert((sbm.Width > 2) and (sbm.Height > 2), 'Bitmap must be at least 3x3');
  Assert((alpha > 1) and (alpha < 6), 'Alpha must be >1 and <6');
  beta := (alpha - 1) / 5;
  intb := round(beta * $10000);
  inta := round(alpha * $10000);
  sbm.PixelFormat := pf24bit;
  tbm.PixelFormat := pf24bit;
  tbm.Width := sbm.Width;
  tbm.Height := sbm.Height;
  bmw := sbm.Width - 2;
  bmh := sbm.Height - 2;
  BytesPerScanline := (((bmw + 2) * 24 + 31) and not 31) div 8;

  tr := tbm.Scanline[0];
  tt := pRGBTriple(tr);

  sr[0] := sbm.Scanline[0];
  st[0] := pRGBTriple(sr[0]);
  for j := 0 to bmw + 1 do
  begin
    tt^ := st[0]^;
    inc(tt); inc(st[0]);
  end;

  sr[1] := PByte(integer(sr[0]) - BytesPerScanline);
  sr[2] := PByte(integer(sr[1]) - BytesPerScanline);
  for i := 1 to bmh do
  begin
    Dec(tr, BytesPerScanline);
    tt := pRGBTriple(tr);
    st[0] := pRGBTriple(integer(sr[0]) + 3);
    st[1] := pRGBTriple(sr[1]); //left
    st[2] := pRGBTriple(integer(sr[1]) + 3);
    st[3] := pRGBTriple(integer(sr[1]) + 6);
    st[4] := pRGBTriple(integer(sr[2]) + 3);
    tt^ := st[1]^; //1st col unchanged
    for j := 1 to bmw do
    begin
      re := 0; gr := 0; bl := 0;
      for k := 0 to 4 do
      begin
        re := re + st[k]^.rgbtRed;
        gr := gr + st[k]^.rgbtGreen;
        bl := bl + st[k]^.rgbtBlue;
        inc(st[k]);
      end;
      re := (intb * re + $7FFF) shr 16;
      gr := (intb * gr + $7FFF) shr 16;
      bl := (intb * bl + $7FFF) shr 16;
      p := pRGBTriple(st[1]);
      re := (inta * p^.rgbtRed + $7FFF) shr 16 - re;
      gr := (inta * p^.rgbtGreen + $7FFF) shr 16 - gr;
      bl := (inta * p^.rgbtBlue + $7FFF) shr 16 - bl;
      inc(tt);
      if re < 0 then
        re := 0
      else
        if re > 255 then
          re := 255;
      if gr < 0 then
        gr := 0
      else
        if gr > 255 then
          gr := 255;
      if bl < 0 then
        bl := 0
      else
        if bl > 255 then
          bl := 255;
      tt^.rgbtRed := re;
      tt^.rgbtGreen := gr;
      tt^.rgbtBlue := bl;
    end;
    inc(tt);
    inc(st[1]);
    tt^ := st[1]^;
    sr[0] := sr[1];
    sr[1] := sr[2];
    Dec(sr[2], BytesPerScanline);
  end;
  Dec(tr, BytesPerScanline);
  tt := pRGBTriple(tr);
  st[1] := pRGBTriple(sr[1]);
  for j := 0 to bmw + 1 do
  begin
    tt^ := st[1]^;
    inc(tt); inc(st[1]);
  end;
end;
Vergessen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.132 Beiträge
 
Delphi 12 Athens
 
#2

AW: Bitmap schärfen

  Alt 24. Apr 2011, 12:33
Zitat:
aber ich hab es nicht geschaft es anzuwenden.
Wie meinst'n das?

Man gibt der Prozedur zwei Bitmaps mit.
In Einem ist das gewünschte Bild und in das Andere wird nun das geschärfte Bild reinkopiert.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
Benutzerbild von barese
barese

Registriert seit: 27. Nov 2009
Ort: Berlin
35 Beiträge
 
Delphi 11 Alexandria
 
#3

AW: Bitmap schärfen

  Alt 25. Apr 2011, 11:26
@ himitsu

Ich weiss nicht wie ich die Procedur anwenden soll.
Natürlich zwei Bitmaps das weiss ich, aber ich brauch eine Befehlszeile
für die Procedur, hast du da ne idee...[?]
Vergessen
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Bitmap schärfen

  Alt 25. Apr 2011, 11:34
Sharpen( Bitmap1, Bitmap2, alpha);
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: Bitmap schärfen

  Alt 25. Apr 2011, 11:34
@ himitsu

Ich weiss nicht wie ich die Procedur anwenden soll.
Natürlich zwei Bitmaps das weiss ich, aber ich brauch eine Befehlszeile
für die Procedur, hast du da ne idee...[?]
Delphi-Quellcode:
var
  sbm, tbm : TBimap;
begin
  sbm := TBitmap.Create;
  tbm := TBitmap.Create;
  // sbm jetzt mit dem Bitmap füllen

  // Schärfen
  Sharpen( sbm, tbm, 20 );
  // tbm dahin packen, wo benötigt

  // Instanzen freigeben
  sbm.Free;
  tbm.Free;
end;
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6

AW: Bitmap schärfen

  Alt 25. Apr 2011, 11:38
Delphi-Quellcode:
Bitmap1 := TBitmap.Create;
Bitmap2 := TBitmap.Create;
foo(Bitmap1, Bitmap2, 0.75);
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von barese
barese

Registriert seit: 27. Nov 2009
Ort: Berlin
35 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Bitmap schärfen

  Alt 25. Apr 2011, 11:43
@ Sir Rufo..

..ach gott Alpha Single ist ein Integer. man bin ich bl..!

Danke !
Vergessen
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#8

AW: Bitmap schärfen

  Alt 25. Apr 2011, 11:45
Nein ein Single ist der kleinste Fliesskomma-Typ
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von barese
barese

Registriert seit: 27. Nov 2009
Ort: Berlin
35 Beiträge
 
Delphi 11 Alexandria
 
#9

AW: Bitmap schärfen

  Alt 25. Apr 2011, 11:47
Ja ...

..mein fehler war das ich anstatt ein Integer eine String für den alpha single benutzt habe.

Man drei tage verzweiflung..!
Vergessen
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: Bitmap schärfen

  Alt 25. Apr 2011, 12:06
Und das obwohl der Code von mir und Luckie einen Fehler beim Aufruf produzieren
Assert((alpha > 1) and (alpha < 6), 'Alpha must be >1 and <6');
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 12:15 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