Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi Rotate mit Graphics32 - Rundungsungenauigkeit? (https://www.delphipraxis.net/107670-rotate-mit-graphics32-rundungsungenauigkeit.html)

mattsbg 31. Jan 2008 15:11


Rotate mit Graphics32 - Rundungsungenauigkeit?
 
Hallo,

ich verwende die Klasse TAffineTransformation der Graphics32 um in meinem Programm Bilder zu rotieren. Mir ist aufgefallen, dass das Bild nach einer Transformation um 180° statt bei Left 0 bei 1 und statt bei Top 0 bei 1 anfängt.
Da das Destination Image aber exakt gleich groß ist wie das Source Image, verliere ich dann Pixel...

Liegt das an einer möglichen Rundungsdifferenz beim Drehen oder doch an meinem Code?

Delphi-Quellcode:
    T := TAffineTransformation.Create;
    T.SrcRect := FloatRect(0, 0, SrcR + 1, SrcB + 1);
    T.Rotate(SrcR / 2, SrcB / 2, -RadToDeg(Angle));

    bmpDest := TBitmap32.Create;
    bmpDest.Width := bmpSrc.Width;
    bmpDest.Height := bmpSrc.Height;
    DrawGraphic(AImage, bmpSrc, Rect(0, 0, SrcR, SrcB));
    Transform(bmpDest, bmpSrc, T);
Anm.: im Normalfall handelt es sich schon um eine freie Drehung, da ich ansonsten natürlich die RotateXX Methoden hernehmen könnte. Aber das hat mich irgendwie stutzig gemacht.

danke für eure Meinung.

Matthias

Medium 1. Feb 2008 01:53

Re: Rotate mit Graphics32 - Rundungsungenauigkeit?
 
Zitat:

Zitat von mattsbg
Delphi-Quellcode:
    T.SrcRect := FloatRect(0, 0, SrcR + 1, SrcB + 1);

Mach aus den "+" einfach mal ein "-". Im Moment rutscht du 2 Pixel weit recht und unten über den Bereich hinaus, was das Drehzentrum um einen Pixel nach rechts/unten verschiebt, und dadurch kommst du auf deinen Rand oben und links.
Anm.: Der unterste rechte Pixel ist immer [Width-1; Height-1]. Der Klassiker bei 0-basierten Arrays trifft auch den Bildkünstler. Hier sogar doppelt stark.

mattsbg 2. Feb 2008 09:08

Re: Rotate mit Graphics32 - Rundungsungenauigkeit?
 
Hi,

danke für den Tipp - ursprünglich hatte ich es weder mit +1 / -1. Dies war schon einer meiner ersten Korrekturversuche (leider in die falsche Richtung).
Habe ich nun richtiggestellt.

Mein SrcRect ist damit nun (l 0,t 0,r 269, b 179). Komischerweise verändert dies nichts beim Resultat - gar keine Auswirkung?!
Weiters fällt mir auf, dass beim Setzen von TBitmap32.SetSize(270,180) das resultierende Boundsrect (l 0,t 0,r 270,b 180) ist?

Wenn ich also das SrcRect meinem bmpSrc.Boundsrect entsprechen lasse und beim Rotate als Center (SrcR-1) / 2, (SrcB-1) / 2 mitgebe, dann wird es ohne den bisherigen Versatz rotiert, allerdings fehlt mir auf jeder Seite immer noch ein Pixel vom SrcBild (wie wenn er nur den inneren Bereich mitnehmen würde). Daran ändert auch eine Vergrößerung des SrcRects nicht.

lg,
Matthias

mattsbg 2. Feb 2008 10:02

Re: Rotate mit Graphics32 - Rundungsungenauigkeit?
 
Hallo,

nach nochmaliger Suche bin ich endlich dem Problem auf die Schliche gekommen. Nun wo ich das mit dem Versatz gelöst habe, ist das eigentlich Problem der verwendete Resampler TLinearResampler.

Dieser ist verursacht das Weglassen der äußersten Pixelreihe. Meine Wahl fiel auf diesen, da dieser bei Bildern die besten Resultate liefert.

lg,
Matthias


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:21 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz