AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Bild Qualität nach der Rotation Problem
Thema durchsuchen
Ansicht
Themen-Optionen

Bild Qualität nach der Rotation Problem

Ein Thema von thomas2009 · begonnen am 7. Sep 2008 · letzter Beitrag vom 8. Sep 2008
Antwort Antwort
Seite 1 von 2  1 2      
thomas2009
(Gast)

n/a Beiträge
 
#1

Bild Qualität nach der Rotation Problem

  Alt 7. Sep 2008, 13:03
Hallo

ich versuche ein Bild zu rotieren ohne viel Verlust der Qualität
Ich habe diese Funktion verwendet :

Function ist here bei delphi.abou

Wenn der Winkel 90, 180, 270 dann sieht man das Problem natürlich nicht sondern nur
wenn man einen beliebigen Winkel für die Rotation nehmt z.B. 45° oder 33°

Ich weiß jetzt nicht ob es an die Funktion liegt oder an eine andere Sache !

Wenn ich aber das selbe Bild mit einem anderen Programm rotiere dann wird das Bild
nicht schlecht (sehe Anhang)
Miniaturansicht angehängter Grafiken
qualitaet_bei_rotation_682.jpg  
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: Bild Qualität nach der Rotation Problem

  Alt 7. Sep 2008, 13:06
Es kommt natürlich auf den Dreh-Algorithmus an.
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
 
Delphi XE2 Professional
 
#3

Re: Bild Qualität nach der Rotation Problem

  Alt 7. Sep 2008, 13:27
Mein Sample Rechnet intern mit einem Doppelt so großen Bild, dadurch wird das ganze dann ein wenig Geglättet.

Ansonsten kannst das ja auch mal selbst implementieren, so schwer ist das nicht.
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

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

Re: Bild Qualität nach der Rotation Problem

  Alt 7. Sep 2008, 13:29
Die beste Qualität würdest du beim Wandeln in eine Vektorgrafik erhalten
Markus Kinzler
  Mit Zitat antworten Zitat
thomas2009
(Gast)

n/a Beiträge
 
#5

Re: Bild Qualität nach der Rotation Problem

  Alt 7. Sep 2008, 14:52
Zitat von Corpsman:
Mein Sample Rechnet intern mit einem Doppelt so großen Bild, dadurch wird das ganze dann ein wenig Geglättet.

Ansonsten kannst das ja auch mal selbst implementieren, so schwer ist das nicht.
Ich habe dein Demo getestet aber die Qualität ist leider genauso schlecht nach der Rotation obwohl ich nicht mit einem großen Bild ausprobiert habe.
Was aber mir bei deinem Demo gut finde, bei der Rotation wird die Maße des canvas optimal angepasst

Zitat von mkinzler:
Die beste Qualität würdest du beim Wandeln in eine Vektorgrafik erhalten
Soll ich das Bild bei der Rotation in eine .wmf zum beispiel konvertieren?
Die Funktion rotiert aber das Bild nur wenn es eine Bitmap ist

Jemand empfehlt mir PlgBlt zu verwenden, habe ich leider keine Ahnung wie es damit geht,
mehr davon : Hier
_
  Mit Zitat antworten Zitat
Benutzerbild von Corpsman
Corpsman

Registriert seit: 8. Nov 2005
Ort: nähe Stuttgart
981 Beiträge
 
Delphi XE2 Professional
 
#6

Re: Bild Qualität nach der Rotation Problem

  Alt 7. Sep 2008, 16:19
Das Problem das du hast ist ja die Mangelnde Kantenglättung.

Gehe her und mache das Bild vorm Drehen doppelt so groß mittels Stretchdraw, dann drehe und verkleinere es wieder. Das müste helfen.

Reicht das nicht gehe über immer größere zwischenbilder..
Uwe
My Sitewww.Corpsman.de

My marble madness clone Balanced ( ca. 70,0 mb ) aktuell ver 2.01
  Mit Zitat antworten Zitat
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#7

Re: Bild Qualität nach der Rotation Problem

  Alt 7. Sep 2008, 16:35
Mein Tipp lautet auch hier wieder Graphics32
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#8

Re: Bild Qualität nach der Rotation Problem

  Alt 7. Sep 2008, 18:04
Und wenn es dennoch Eigenbau sein soll: Es lohnt sich hier die Drehung so zu bauen, dass du nicht das Ausgangsbild vorwärts transformiertst, sondern die Rücktransformation nimmst, und Pixel im Zielbild auf Float-Pixel im Original abbildest. Wenn du dann nicht stumpf rundest, sondern einen interpolierten Farbwert aus den vier betroffenen des Originals nimmst (Bei Google suchenbilineare Interpolation), hast du die sauberst mögliche Variante.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Benutzerbild von Garfield
Garfield

Registriert seit: 9. Jul 2004
Ort: Aken (Anhalt-Bitterfeld)
1.335 Beiträge
 
Delphi XE5 Professional
 
#9

Re: Bild Qualität nach der Rotation Problem

  Alt 7. Sep 2008, 20:16
Sieht ganz ordentlich aus: http://www.delphifr.com/codes/ROTATI...GDI_45850.aspx
Gruss Garfield
Ubuntu 22.04: Laz2.2.2/FPC3.2.2 - VirtBox6.1+W10: D7PE, DXE5Prof
  Mit Zitat antworten Zitat
grizzly

Registriert seit: 10. Dez 2004
150 Beiträge
 
Delphi XE4 Professional
 
#10

Re: Bild Qualität nach der Rotation Problem

  Alt 7. Sep 2008, 20:58
Ja, das von der französischen Seite sieht ganz gut aus. Was mit GDI so alles geht...

Ich hab' auch mal eben schnell was geschrieben, aber auf so eine einfache Lösung bin ich nicht gekommen.
Allerdings habe ich es endlich mal mit linearer Interpolation anstatt immer nur mit "Nearest neighbour" umgesetzt. Das wollte ich eh schon immer mal machen. Falls es jemand interessiert (Aber nur für 24bit Bilder!):
Delphi-Quellcode:
PROCEDURE RotateImage24LinearInterpolation(SourceBMP, DestBMP: TBitmap; Degree: double; BackCol : TColor);
TYPE
  TByteArray = ARRAY[0..655360] OF byte;
  pByteArray = ^TByteArray;
VAR
  X, Y, iX : integer;
  RX, RY : integer;
  dRX, dRY : double;
  SCX, SCY : integer;
  DCX, DCY : integer;
  W, H : integer; // Width and Height of Source Bitmap
  s, c : extended;
  fX, fY, d: double;
  pDest : pByteArray;
  pSource : ARRAY OF pByteArray;
  RGBBack : integer;
  c11, c12,
  c13, c21,
  c22, c23 : double;
BEGIN
  IF Degree = 0 then
    begin
      DestBMP.Assign(SourceBMP);
      EXIT;
    end;
  IF SourceBMP.PixelFormat <> pf24bit then
    exit;

  RGBBack := BackCol;
  // Now switch Blue and Red
  RGBBack := ((RGBBack and $00FF0000) shr 16) or
             ((RGBBack and $0000FF00) ) or
             ((RGBBack and $000000FF) ) shl 16;

  W := SourceBMP.Width;
  H := SourceBMP.Height;
  SCX := W div 2;
  SCY := H div 2;

  SinCos(Degree*Pi/180, s, c);

  // Calculate new size for Destinatio image
  DestBMP.PixelFormat := pf24bit;
  DestBMP.Height := round(Abs(c * H) + Abs(s * W));
  DestBMP.Width := round(Abs(s * H) + Abs(c * W));
  DCX := DestBMP.Width div 2;
  DCY := DestBMP.Height div 2;

  SetLength(pSource, H);
  FOR Y := 0 TO H-1 DO
    pSource[Y] := SourceBMP.Scanline[Y];

  //--- Linear interpolation. Slower, but looks much better...
  FOR Y := DestBMP.Height-1 DOWNTO 0 DO
    BEGIN
      pDest := DestBMP.ScanLine[Y];
      iX := 0;
      FOR X := 0 TO DestBMP.Width-1 DO
        BEGIN
          dRX := SCX + ( c * (X-DCX) - s * (Y-DCY));
          dRY := SCY + ( s * (X-DCX) + c * (Y-DCY));
          IF (dRX >= 1) and (dRY >= 1) and (dRX < W-1) and (dRY < H-1)
            then begin
              fX := frac(dRX);
              fY := frac(dRY);
              RX := trunc(dRX)*3; // "*3" because of 24 bit images
              RY := trunc(dRY);

              d := 1-fX;
              c11 := pSource[RY]^[ RX ]*(d) + pSource[RY]^[ RX+3 ]*(fX);
              c12 := pSource[RY]^[RX+1]*(d) + pSource[RY]^[RX+3+1]*(fX);
              c13 := pSource[RY]^[RX+2]*(d) + pSource[RY]^[RX+3+2]*(fX);
              Inc(RY);
              c21 := pSource[RY]^[ RX ]*(d) + pSource[RY]^[ RX+3 ]*(fX);
              c22 := pSource[RY]^[RX+1]*(d) + pSource[RY]^[RX+3+1]*(fX);
              c23 := pSource[RY]^[RX+2]*(d) + pSource[RY]^[RX+3+2]*(fX);

              d := 1-fY;
              pDest^[iX] := trunc(c11*(d) + c21*fY);
              Inc(iX);
              pDest^[iX] := trunc(c12*(d) + c22*fY);
              Inc(iX);
              pDest^[iX] := trunc(c13*(d) + c23*fY);
              Inc(iX);
            end
            else begin
              RX := trunc(dRX);
              RY := trunc(dRY);
              // No linear interpolation for pixels at the outer rim
              // Those pixels were copied like in the nearest neighbour algorithm.
              IF (RX >= 0) and (RY >= 0) and (RX < W) and (RY < H)
                then begin
                  move(pSource[RY]^[RX*3], pDest^[iX], 3);
                end
                else begin // Pixel completely outside of the original image
                  move(RGBBack, pDest^[iX], 3);
                end;
              Inc(iX, 3);
            end;
        END;
    END;

  SetLength(pSource, 0);
END;
Eine Gegenüberstellung kann man sich mit dem Demo-Projekt im Anhang verschaffen.

Gruß
Michael
Miniaturansicht angehängter Grafiken
screen01_423.jpg  
Angehängte Dateien
Dateityp: zip rotateimage_source_131.zip (47,5 KB, 23x aufgerufen)
  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 21:50 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