Bild um 22,5 Grad drehen

Hallo,

das sieht etwas komisch aus:

1.) Wie kann ich die neue Größe des Bilds (BufferedImage) berechnen, wäre dann ja größer?
2.) Wie vermeide ich diese “weißen Punkte”, die zwischendrin sind?

Bei einer Drehung um 90° usw. tritt das Problem verständlicherweise nicht auf…

  1. Die Eckpunkte transformieren, und von denen dann das bounding rectangle berechnen (auch klarmachen, dass wichtig ist, um welchen Punkt gedreht wird)

Wie genau drehst du? Das sieht aus, als würdest du die Quellpixel (nicht zufällig mit einer Matrix?) auf Zielkoordinaten mappen und dann dort direkt zeichnen. Dabei kann es (durch Runding etc) passieren, dass ein Punkt auf den Zielpixel (10,20) abgebildet wird, aber der nächste schon auf (12,20) (aber eben keiner auf (11,20)). Um das zu verhindern, muss man alle Zielpixel durchgehen, und (mit der Inversen der Matrix!) berechnen, “wo sie herkommen”. Speziell wenn das Bild später mit der Matrix auch skaliert werden soll, ist das wichtig, weil da ein Quellpixel auf mehrere Zielpixel abgebildet werden muss.

Hallo, danke der schnellen Antwort,

Genau so ist es! Ich drehe mit einer Matrix (auch Runden hab ich versucht), aber gehe alle Quellpixel durch. Dass das falsch ist, hätte ich mir denken können. :frowning:

Also zunächst den Hüllkörper anhand der 4 Punkte berechnen, dann durch alle Zielpixel gehen und mit der inversen Matrix berechnen.

Wie komme ich auch an die Koordinaten der Zielpixel?

*** Edit ***

Edit:

Schon durch etwas überlegen herausgefunden, falls die neuen Koordinaten der Quellpixel außerhalb der Bounds sind, passen sich nicht mehr zum Bild.

*** Edit ***

Mit der Inversen Matrix funktioniert’s, leider ist die Inverse Matrix auch noch mal ein Problem:

Das Bild sieht etwas verwaschen aus, „keine klaren Kanten“, etc.

Aber keine weißen Punkte/Stellen mehr.

Wie lässt sich der Mittelpunkt/Schwerpunkt eines schiefen Bildes bestimmen, wie lässt es sich zentrieren?#

Außerdem gilt auf Screens/Bildschirmen leider, -Alpha == Alpha, da Koordinaten oben links bei (0,0) anfangen, wenn ich um 22,5° drehen möchte, muss ich mit -22,5° rechnen. :stumm:

Aber danke, erst mal: done.

das ist jetzt zwar genau der falsche Filter - aber das passende Gegenstück wird sich sicher auch irgendwo auftreiben lassen

Ja, schärfen geht auch mit der entsprechenden Faltung, siehe z.B. auch http://www.oracle.com/technetwork/articles/java/java2dpart2-139741.html
Aber ich denke nicht, dass das hier hilft.
Das Bild sieht ein bißchen aus, als KÖNNTE da an einer unglücklichen Stelle ein cast nach int vorkommen.
Aber vielleicht auch nicht: Die leichten Zacken sind bei so einem einfachen Lookup eigentlich normales Aliasing. Um die zu vermeiden, müßte man in die Trickkiste greifen, und mehrere Quellpunkte interpolieren. GANZ GANZ (!) Grob: Wenn man den Punkt (10,20) mit der invertierten Matrix auf den Punkt (3.5,8.0) zurückrechnet, könnte man die Punkte von (3,8) und (4,8) “mischen”, um die richtige Farbe zu erhalten.

Okay, hier ist mal der absolute Vergleich (wie immer, verlustfreie Komprimierung):

Das Original ist mit dabei. Bitte zoomt das auf 100 %.

1.) Erkennt ihr zwischen Bild 3 und 4 noch einen Unterschied?

Dont Pokemon And Drive. ist bei Bild 4 etwas deutlicher/klarer zu erkennen, dafür
ist die Umrandung des Schilds / traffic/road sign “etwas kantig”. (imo)

Edit: 2.) Ist das Originalbild vielleicht “nicht so tauglich”? Ich hab das einfach von FB kopiert.

3.) Weiter kann ich im Moment damit nicht befassen…