2015-12-07 3 views
0

При попытке повернуть изображение представляется, что часть фона чернеет (мои изображения транспаранты)Java вращать изображение получается часть фона черного

Background white
Part of background turns black

Вот код, который повернуть изображение:

public BufferedImage rotate(int height, int width, BufferedImage originalImg, int angle) { 
    BufferedImage rotateImage = null; 
    try { 
     rotateImage = new BufferedImage(height, width, BufferedImage.TYPE_INT_RGB); 
     AffineTransform a90 = AffineTransform.getRotateInstance(Math.toRadians(angle), height/2, width/2); 
     AffineTransformOp op90 = new AffineTransformOp(a90, AffineTransformOp.TYPE_BILINEAR); 
     op90.filter(originalImg, rotateImage); 
    } 
    catch (Exception e) { 
     System.err.println(e); 
    } 
    return rotateImage; 
} 
+2

Все API-интерфейсы, которые принимают ширину и высоту, будут иметь аргумент width перед аргументом высоты. Я не уверен, что вы переключили их намеренно. Независимо от того, конструктор BufferedImage ожидает ширину, за которой следует высота, а метод AffineTransform.getRotateInstance ожидает координату X, за которой следует координата Y. – VGR

+0

Ну, мои изображения все квадратные, поэтому он не сильно меняется, и getRotateInstance нуждается в якоре для поворота вокруг, поэтому я отправил середину моего изображения с высотой/2 и шириной/2 – Kariamoss

+1

Это касается меня: 'BufferedImage.TYPE_INT_RGB'. Разве это не должно быть 'BufferedImage.TYPE_INT_ARGB'? У вас есть прозрачность, то есть вам нужна альфа. –

ответ

3

Итак, я скачал вы «оригинальный» образ (который не является квадратом), модифицировали его так было квадратным, запустить свой код, получил java.awt.image.ImagingOpException: Unable to transform src image исключение, изменилось BufferedImage.TYPE_INT_RGB в BufferedImage.TYPE_INT_ARGB и получил ...

Rotated

import java.awt.geom.AffineTransform; 
import java.awt.image.AffineTransformOp; 
import java.awt.image.BufferedImage; 
import java.io.IOException; 
import javax.imageio.ImageIO; 
import javax.swing.ImageIcon; 
import javax.swing.JLabel; 
import javax.swing.JOptionPane; 
import javax.swing.JPanel; 

public class Main { 

    public static void main(String[] args) { 
     try { 
      BufferedImage img = ImageIO.read(Main.class.getResource("/Block.jpg")); 
      BufferedImage rotate = rotate(img.getHeight(), img.getWidth(), img, 90); 

      JPanel panel = new JPanel(); 
      panel.add(new JLabel(new ImageIcon(img))); 
      panel.add(new JLabel(new ImageIcon(rotate))); 

      JOptionPane.showMessageDialog(null, panel); 
     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
    } 

    public static BufferedImage rotate(int height, int width, BufferedImage originalImg, int angle) { 
     BufferedImage rotateImage = null; 
     try { 
      rotateImage = new BufferedImage(height, width, BufferedImage.TYPE_INT_ARGB); 
      AffineTransform a90 = AffineTransform.getRotateInstance(Math.toRadians(angle), height/2, width/2); 
      AffineTransformOp op90 = new AffineTransformOp(a90, AffineTransformOp.TYPE_BILINEAR); 
      op90.filter(originalImg, rotateImage); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return rotateImage; 
    } 

} 

Мои, "кишка" чувство также изменить метод rotate, как это не нужно width и height значения;

public static BufferedImage rotate(BufferedImage originalImg, int angle) { 
    BufferedImage rotateImage = null; 
    try { 
     rotateImage = new BufferedImage(originalImg.getWidth(), originalImg.getHeight(), BufferedImage.TYPE_INT_ARGB); 
     AffineTransform a90 = AffineTransform.getRotateInstance(Math.toRadians(angle), originalImg.getWidth()/2, originalImg.getHeight()/2); 
     AffineTransformOp op90 = new AffineTransformOp(a90, AffineTransformOp.TYPE_BILINEAR); 
     op90.filter(originalImg, rotateImage); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
    return rotateImage; 
} 

необходимо использовать размеры оригинального изображения напрямую. Это позволит выявить возможные ошибки в ваших изображениях. Это также предполагает, что вы хотите только поворачивать изображение с шагом в 90 градусов.

+0

Спасибо большое! Я сделал ваши изменения, и он отлично работает – Kariamoss

 Смежные вопросы

  • Нет связанных вопросов^_^