2012-08-28 17 views
10

Próbuję obrócić obraz. Używam tego kodu Java:Java - obrót obrazu

BufferedImage oldImage = ImageIO.read(new FileInputStream("C:\\workspace\\test\\src\\10.JPG")); 
BufferedImage newImage = new BufferedImage(oldImage.getHeight(), oldImage.getWidth(), oldImage.getType()); 
Graphics2D graphics = (Graphics2D) newImage.getGraphics(); 
graphics.rotate(Math.toRadians(90), newImage.getWidth()/2, newImage.getHeight()/2); 
graphics.drawImage(oldImage, 0, 0, oldImage.getWidth(), oldImage.getHeight(), null); 
ImageIO.write(newImage, "JPG", new FileOutputStream("C:\\workspace\\test\\src\\10_.JPG")); 

Ale widzę dziwny wynik:

Źródło:

**Sourse image:**

Wynik:

**Result image:** http://s14.postimage.org/cjut935ip/image.jpg

Czy możesz pomóc mnie z tym problemem?

+3

Czy nie powinieneś obracać wokół środka oldImage, a nie newImage? –

+0

Próbuję graphics.rotate (Math.toRadians (90), oldImage.getWidth()/2, oldImage.getHeight()/2); To nie pomoże. http://s13.postimage.org/7omxa1oef/image.jpg – user1631241

Odpowiedz

14

Nie wystarczy zmienić szerokość i wysokość obrazu. Obracasz się, używając środka obrazu jako początku obrotu. Po prostu spróbuj zrobić to samo z kartką papieru, a zobaczysz, że działa w ten sam sposób. Musisz także trochę przesunąć papier, co oznacza zastosowanie transformacji, aby to naprawić. Zaraz po wywołaniu rotacji zrób to:

graphics.translate((newImage.getWidth() - oldImage.getWidth())/2, (newImage.getHeight() - oldImage.getHeight())/2); 
+0

Działa! Bardzo dziękuję! – user1631241

+0

Wiem :) Nie ma za co. –

+0

Wstydzę się, że nie myślę o tym od razu ... :-p – oldrinb

0

Nowy obraz ma różne rozmiary ze względu na obrót. spróbuj tego: BufferedImage newImage = new BufferedImage (oldImage.getWidth(), oldImage.getHeight(), oldImage.getType());

+0

Uh, jest bardzo świadomy, że istnieją różne rozmiary. Twój kod nic nie rozwiązuje. – oldrinb

+0

Już próbuje. Po tym mam: http://s11.postimage.org/4jvhjtewz/image.jpg – user1631241

0

próby uzyskania granice swojej tablicy, na której zrobisz rysunek

Rectangle rect = this.getBounds(); 

a następnie wykonaj:

graphics.rotate(Math.toRadians(90), (rect.width - newImage.getWidth())/2, (rect.height - newImage.getHeight())/2); 

nadzieję, że może pomóc Cheers!

+0

spóźniłem się na minutę ... no cóż: P –

0

Możesz napisać w ten sposób, że będzie to praca.

BufferedImage newImage = new BufferedImage(oldImage.getWidth(), oldImage.getHeight(), oldImage.getType()); 

myślę miejsce dla width i height jest źle w kodzie.