![]() |
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:
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.
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); danke für eure Meinung. Matthias |
Re: Rotate mit Graphics32 - Rundungsungenauigkeit?
Zitat:
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. |
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 |
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