Java旋转图像将部分背景变为黑色

Java旋转图像将部分背景变为黑色,java,swing,image-rotation,affinetransform,rgba,Java,Swing,Image Rotation,Affinetransform,Rgba,当我尝试旋转图像时,背景的一部分似乎变为黑色(我的图像是透明的) 下面是旋转图像的代码: public BufferedImage rotate(int height, int width, BufferedImage originalImg, int angle) { BufferedImage rotateImage = null; try { rotateImage = new BufferedImage(height, width, BufferedI

当我尝试旋转图像时,背景的一部分似乎变为黑色(我的图像是透明的)


下面是旋转图像的代码:

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;
}
所以,我下载了你的“原始”图像(不是正方形),修改成正方形,运行你的代码,得到了一个
java.awt.image.ImagingOpException:无法转换src图像
异常,更改了
BufferedImage.TYPE_INT_RGB
BufferedImage.TYPE_INT_ARGB
并得到了

我的“直觉”感觉也是修改
旋转
方法,因为它不需要
宽度
高度

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度的增量旋转图像

因此,我下载了您的“原始”图像(不是正方形),将其修改为正方形,运行您的代码,得到了一个
java.awt.image.ImagingOpException:无法转换src图像
异常,将
BufferedImage.TYPE_INT_RGB
更改为
BufferedImage.TYPE_INT_ARGB
,并获得

我的“直觉”感觉也是修改
旋转
方法,因为它不需要
宽度
高度

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度的增量旋转图像

所有同时接受宽度和高度的API都会将宽度参数置于高度参数之前。我不确定你是否故意把它们调换了。无论如何,BuffereImage构造函数要求宽度后跟高度,而AffineTransform.getRotateInstance方法需要一个X坐标,后跟一个Y坐标。我的图像都是正方形,所以变化不大,getRotateInstance需要一个锚来旋转,所以我发送了高度为/2、宽度为/2的图像中间。这与我有关:
BuffereImage。键入\u INT\u RGB
。那不应该是
BufferedImage.TYPE\u INT\u ARGB
?你有透明度,这意味着你需要阿尔法。它有效!非常感谢,我没有看到所有同时接受宽度和高度的API都会将宽度参数放在高度参数之前。我不确定你是否故意把它们调换了。无论如何,BuffereImage构造函数要求宽度后跟高度,而AffineTransform.getRotateInstance方法需要一个X坐标,后跟一个Y坐标。我的图像都是正方形,所以变化不大,getRotateInstance需要一个锚来旋转,所以我发送了高度为/2、宽度为/2的图像中间。这与我有关:
BuffereImage。键入\u INT\u RGB
。那不应该是
BufferedImage.TYPE\u INT\u ARGB
?你有透明度,这意味着你需要阿尔法。它有效!非常感谢,我没看到,非常感谢!我做了你的改变,效果很好,非常感谢!我做了你的改变,效果很好