Frage

Ich bin auf der Suche nach einem Algorithmus, der dreht ein Bild um einige Grad (input).

public Image rotateImage(Image image, int degrees)

(Bild Instanzen ersetzt werden könnte mit int[] mit jedem pixel-RGB-Werte, Mein problem ist, dass ich Sie implementieren müssen, um es für eine MIDP 2.0 JavaME-Projekt, so muss ich verwenden ausführbarer code auf der JVM vor version 1.5 Kann mir jemand helfen mit diesem ?

EDIT:Ich vergaß zu erwähnen, dass ich nicht die SVG-APIs zur Verfügung und ich muss eine Methode zum drehen von beliebiger anderer Grad als 90 - 180- 270

Auch kein java.awt.* Pakete werden verfügbar auf MIDP 2.0

War es hilfreich?

Lösung

Eine der besten Seiten beschreibt, Bildrotation Algorithmen ich im Internet gefunden habe, ist gebunden an Dan Bloomberg ausgezeichnet leptonica Bibliothek. Während die leptonica Bibliothek selbst ist in C geschrieben und wird nicht helfen, seine Seite auf Bildrotation Algorithmen:

http://www.leptonica.org/rotation.html

ist auf jeden Fall lesenswert. Sie werden wahrscheinlich wollen so etwas wie die Rotation durch Bereich Mapping-Algorithmus implementieren er im zweiten Teil der Seite beschreibt.

Andere Tipps

Allgemeine Lösung: Für jedes pixel in das Ziel-Bild, nehmen die pixel im Quellbild mit den Koordinaten des Ziel-pixel, gedreht in die entgegengesetzte Richtung.

Erweiterung Lösung: Die rotation der Regel nicht die genauen Pixelkoordinaten.Mache einen gewichteten Durchschnitt der Quell-pixel mit seinen Nachbarn, nach der percentage-es überlagert diese.

Schneller Lösung für binäre Bilder: Konvertieren Sie das Bild in "" läuft von aufeinander folgenden Vordergrund-Pixel.Drehen Sie dann die Endpunkte dieser Linien und ziehen Sie ins Ziel.

Normalerweise ergeben sich leichte Lücken aufgrund von integer roundoff, so dass, wenn einer oder beide Endpunkte sind mehr als 10% Weg von einer integer -, patch-durch das zeichnen von ZWEI Linien für die einzelnen Quellcode-Zeile, mit der integer-Koordinaten gerundet, oben und unten.

Wenn ein Endpunkt ist innerhalb von 10% und der andere nicht, der zwei Linien bilden ein " V " - Form.Wenn beide ausgeschaltet sind, um mehr als 10%, die zwei Linien bilden ein " X " shape.

Dies kann getan werden, mit Bezug auf die X-Achse oder die Y-Achse .Verwenden Sie die mit dem kleinsten Winkel zwischen der Achse und den Drehwinkel.(I. e.wenn die Drehung Winkel ist zwischen 45 und -45, verwenden Sie die X-Achse.)

Noch schnellere Lösung für binäre Bilder: Wenn es weniger Pixel hintergrund als Vordergrund-Pixel, füllen Sie das Ziel mit Vordergrund, und Folgen Sie den oben beschriebenen Algorithmus mit hintergrund-Pixel.

Nokia Foren haben einen Artikel und Code auf Drehen von Bildern in Java ME

LWUIT kann das tun und es ist Open Source. Ich schlage vor, Sie den Code dort finden.

Sie können versuchen, http://www.j2mearmyknife.com/ . Es verfügt über eine Menge cooler visueller Effekte, einschließlich Bildrotation.

Graphics2D und Affine wird Ihnen helfen, genau das tun, was Sie wollen. Insbesondere Graphics2D.drawImage (Bild, Affine) und AffineTransform.getRotateInstance. Sie können auch tun Skalierung, Übersetzung und mit diesem Scheren. Beide Klassen haben seit mindestens 1,4 wahrscheinlich in der Laufzeit war früher.

  public Image rotateImage(Image img, float degrees){
   BufferedImage sourceBI = new BufferedImage(img.getWidth(null),img.getHeight(null),BufferedImage.TYPE_INT_ARGB);
   sourceBI.getGraphics().drawImage(img,0,0,null);
   AffineTransform at = new AffineTransform();
   at.rotate(degrees*Math.PI/180, sourceBI.getWidth()/2, sourceBI.getHeight()/2);
   BufferedImageOp bio = new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR);
   return bio.filter(sourceBI, null);
  }
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top