AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi Rotate mit Graphics32 - Rundungsungenauigkeit?
Thema durchsuchen
Ansicht
Themen-Optionen

Rotate mit Graphics32 - Rundungsungenauigkeit?

Ein Thema von mattsbg · begonnen am 31. Jan 2008 · letzter Beitrag vom 2. Feb 2008
Antwort Antwort
mattsbg

Registriert seit: 31. Jan 2008
3 Beiträge
 
#1

Rotate mit Graphics32 - Rundungsungenauigkeit?

  Alt 31. Jan 2008, 15:11
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
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.679 Beiträge
 
Delphi 2007 Enterprise
 
#2

Re: Rotate mit Graphics32 - Rundungsungenauigkeit?

  Alt 1. Feb 2008, 01:53
Zitat von mattsbg:
    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.
"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
mattsbg

Registriert seit: 31. Jan 2008
3 Beiträge
 
#3

Re: Rotate mit Graphics32 - Rundungsungenauigkeit?

  Alt 2. Feb 2008, 09:08
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
  Mit Zitat antworten Zitat
mattsbg

Registriert seit: 31. Jan 2008
3 Beiträge
 
#4

Re: Rotate mit Graphics32 - Rundungsungenauigkeit?

  Alt 2. Feb 2008, 10:02
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
  Mit Zitat antworten Zitat
Antwort Antwort


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 16:04 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