2016-11-09 4 views
2

Ich habe versucht, ein Bild in Java mit setRGB und BufferedImage zu drehen, aber ich bekomme ein seltsames Ergebnis. Hat jemand eine Idee warum?BufferedImage setRGB seltsames Ergebnis

BufferedImage pic1 = ImageIO.read(new File("Images/Input-1.bmp")); 
    int width = pic1.getWidth(null); 
    int height = pic1.getHeight(null); 

    double angle = Math.toRadians(90); 
    double sin = Math.sin(angle); 
    double cos = Math.cos(angle); 
    double x0 = 0.5 * (width - 1);  // point to rotate about 
    double y0 = 0.5 * (height - 1);  // center of image 

    BufferedImage pic2 = pic1; 

    // rotation 
    for (int x = 0; x < width; x++) { 
     for (int y = 0; y < height; y++) { 
      double a = x - x0; 
      double b = y - y0; 
      int xx = (int) (+a * cos - b * sin + x0); 
      int yy = (int) (+a * sin + b * cos + y0); 

      if (xx >= 0 && xx < width && yy >= 0 && yy < height) { 
       pic2.setRGB(x, y, pic1.getRGB(xx, yy)); 
      } 
     } 
    } 
    ImageIO.write(pic2, "bmp", new File("Images/Output2.bmp")); 

In LEFT Seite ist das Originalbild und in der RIGHT Seite ist es mein Ergebnis. Hat jemand eine Idee wie ich das beheben kann? enter image description here

Danke für Hilfe.

+1

Sie können ein Bild nicht an Ort und Stelle drehen. Sie machen ein weiteres gedrehtes Bild. Wenn Sie ein Bild um 90 Grad drehen möchten, müssen Sie die Rotate-Berechnung nicht durchführen. Kopieren Sie einfach die x-Koordinate in die neue y-Koordinate und die y-Koordinate in die neue x-Koordinate. –

Antwort

1

Das Problem ist, dass Sie das gleiche Bild wie Ein- und Ausgabe verwenden:

BufferedImage pic2 = pic1;

Sie müssen ein weiteres Bild für pic2 erstellen und dann die Drehung durchführen, indem Sie Pixel von Image1 nach Image2 kopieren.

Beachten Sie jedoch, dass mit getRGB und setRGB es sehr langsam ist. Es ist 100 mal schneller, wenn Sie die Pixel direkt manipulieren.

+0

Danke Ich habe diesen Fehler nicht bemerkt: D jetzt funktioniert es. und über die setRBG und getRGB ... Ich weiß, dass sie so langsam sind .... aber ich weiß nicht, wie man ein Bild in etwas wie Pixel [] [] umwandelt. Ich habe überall im Internet gesucht und alles, was ich gesehen habe, ist, wie man ein Array 1D von einem Bild bekommt, ich meine etwas wie Pixel []. Aber ich brauche ein 2D-Array wie Pixel [] [] und ich hatte keine Ahnung, wie man es bekommt .... Können Sie mir bitte dabei helfen? : D –

+0

In diesem erstellen Sie ein Bild mit den Pixeln: http://StackOverflow.com/Questions/8856569/How-to-get-the-array-of-pixel-values-for-an-an-image-in -java-using-getrgb –