Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Bild drehen mit Graphics32 und / oder GDI+ (https://www.delphipraxis.net/162177-bild-drehen-mit-graphics32-und-oder-gdi.html)

schlagzu 10. Aug 2011 21:13

Bild drehen mit Graphics32 und / oder GDI+
 
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,

ich habe mal wider ne Stelle, an der ich nicht weiterkomme. Wahrscheinlich finde ich in den nächsten 15 min die Lösung, aber trotzdem suche ich eure Hilfe. Ich benutzte zur zeit diese (auch die einzige funktionierende die ich gefunden habe) Procedure die ich im Forum hier gefunen habe:

Delphi-Quellcode:
procedure Rotate(const Src: TBitmap32; const Dst: tBitmap32; Angle: Single; x,y: integer);
var
  SrcR: Integer;
  SrcB: Integer;
  T: TAffineTransformation;
  Sx, Sy, Scale: Single;
begin
  SrcR := Src.Width - 1;
  SrcB := Src.Height - 1;
  T := TAffineTransformation.Create;
  T.SrcRect := FloatRect(0, 0, SrcR +1, SrcB + 1);
  try
    // shift the origin
    T.Clear;

    // move the origin to a center for scaling and rotation
    T.Translate(-SrcR / 2 , -SrcB / 2 );
    T.Rotate(0, 0, Angle);

    // move the origin back
    T.Translate(SrcR / 2, SrcB / 2 );

    // zu x und y bewegen
    T.Translate(x,y);

    // transform the bitmap
    Transform(Dst, Src, T);
  finally
    T.Free;
  end;
end;
Jedoch entstehen dabei unschöne ränder bei 90° 180° 270° entstehen. Siehe bild:

http://www.delphipraxis.net/attachme...1&d=1313007044

Darum suche ich eine Lösung diese Problems oder eine andere Möglichkeit auch mit gdi+ falls nötig!

MfG schlagzu

Jens01 10. Aug 2011 22:50

AW: Bild drehen mit Graphics32 und / oder GDI+
 
Vielleicht sind das irgendwelche Rundungsfehler von Float auf Integer beim Teilen mit / z.B hier:
Code:
T.Translate(-SrcR / 2 , -SrcB / 2 );
Warum wird hier 1 abgezogen?
Code:
SrcR := Src.Width - 1;
Was ist hiermit?
http://graphics32.org/news/newsgroup...ticle_id=11397

Medium 11. Aug 2011 00:11

AW: Bild drehen mit Graphics32 und / oder GDI+
 
Zitat:

Zitat von Jens01 (Beitrag 1116125)
Warum wird hier 1 abgezogen?

Indizierung. Ein Bitmap der Breite 640 hat die Pixelkoordinaten 0..639. Normalerweise! Allerdings kann das hier in der Tat das Problem sein, der Autor war sich zwar beim FloatRect() der anderen Rasterbildung bei Float-Indizierung bewusst, beim Translate() dagegen nicht. Also die "-1" mal raus, und beim FloatRect() die "+1" weg. Das könnte es schon sein.

Ansonsten: Hat dein Bitmap gerade oder ungerade Ausmaße? Wie verhält sich das mit einem Bitmap je ein Pixel höher und breiter? Und: Ist das Bitmap wirklich exakt quadratisch?

schlagzu 11. Aug 2011 15:25

AW: Bild drehen mit Graphics32 und / oder GDI+
 
Liste der Anhänge anzeigen (Anzahl: 3)
Zitat:

Zitat von Jens01 (Beitrag 1116125)

Da gibt es zu viele fremde Komponenten, die ich nicht finde z.B.: ksLanczosKernel


Also ich habe folgende Möglichkeiten mit folgenden Ergebnissen:

1:
[SIZE="8"]
Delphi-Quellcode:
  SrcR := Src.Width;
  SrcB := Src.Height;
  T := TAffineTransformation.Create;
  T.SrcRect := FloatRect(0, 0, SrcR +1, SrcB + 1);
[/SIZE]
http://www.delphipraxis.net/attachme...1&d=1313072297
2:
[SIZE="8"]
Delphi-Quellcode:
  SrcR := Src.Width;
  SrcB := Src.Height;
  T := TAffineTransformation.Create;
  T.SrcRect := FloatRect(0, 0, SrcR, SrcB);
[/SIZE]
http://www.delphipraxis.net/attachme...1&d=1313072540

3:
Delphi-Quellcode:
[SIZE="8"] SrcR := Src.Width -1;
  SrcB := Src.Height -1;
  T := TAffineTransformation.Create;
  T.SrcRect := FloatRect(0, 0, SrcR, SrcB);[/SIZE]
http://www.delphipraxis.net/attachme...1&d=1313071853

Das erste Bild war 100x100 Px groß das jetzige ist 101x101 (hat aber keine Auswirkung, habe jede Änderung auch mit 100x100 probiert).

Danke für die Hilfe, vllt könnte nochmal jemand sich diesem Problem annehmen.

MfG schlagzu

freeway 11. Aug 2011 16:28

AW: Bild drehen mit Graphics32 und / oder GDI+
 
hmm wenn ich den Source richtig interpretiere...

bei 100x100 ist der Ratotionspunkt um 1 verschoben
bei 101x101 tritt beim verschieben des Bildes ein Rundungsfehler auf (um 1 versetzt)

schlagzu 11. Aug 2011 19:08

AW: Bild drehen mit Graphics32 und / oder GDI+
 
Gibt es dafür eine Lösung?

EWeiss 11. Aug 2011 19:35

AW: Bild drehen mit Graphics32 und / oder GDI+
 
Schlag mal hier zu..
http://www.delphipraxis.net/130998-a...-rotation.html

Und ohne Antialias wird das definitiv nichts mit deinen Kanten.

gruss

ehX 11. Aug 2011 22:49

AW: Bild drehen mit Graphics32 und / oder GDI+
 
Zitat:

Da gibt es zu viele fremde Komponenten, die ich nicht finde z.B.: ksLanczosKernel
Die Kernel-Resampler sind bei Graphics32 dabei und sind keine Fremd-Komponenten.
Du musst dazu einfach nur die unit GR32_Resamplers einbinden, da finden sich alle möglichen Kernel.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:55 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