首页 > 解决方案 > Graphics2D 在保存文件前旋转

问题描述

我用 g2d 创建了这个图像:

在此处输入图像描述

这是代码:

BufferedImage bufferedImage = new BufferedImage(408, 408, BufferedImage.TYPE_INT_RGB);    
Graphics2D g2d = bufferedImage.createGraphics();
List<Pixel> pixels = cacheRepo.findAll();
pixels.stream().forEach(pixel -> {
    g2d.setColor(getColorFromPixel(pixel));
    g2d.fillRect(getPos(pixel.getPosition().x), getPos(pixel.getPosition().y), 20, 20);
});

现在我试图将它旋转 90° anticlok,使蓝色方块出现在左下方:

在此处输入图像描述

所以我添加了这个:

g2d.rotate(Math.toRadians(90));
g2d.drawRenderedImage(bufferedImage, null);

但是没有发生旋转(我仍然有相同的图像)。

这是完整的代码,其中包含保存图像的部分:

 // Constructs a BufferedImage of one of the predefined image types.
    BufferedImage bufferedImage = new BufferedImage(408, 408, BufferedImage.TYPE_INT_RGB);
    // Create a graphics which can be used to draw into the buffered image
    Graphics2D g2d = bufferedImage.createGraphics();
    List<Pixel> pixels = cacheRepo.findAll();
    pixels.stream().forEach(pixel -> {
        g2d.setColor(getColorFromPixel(pixel));
        g2d.fillRect(getPos(pixel.getPosition().x), getPos(pixel.getPosition().y), 20, 20);
    });
    g2d.rotate(Math.toRadians(90));
    g2d.drawRenderedImage(bufferedImage, null);
    g2d.dispose();
    // Save as PNG
    File file = new File("myimage.png");
    try {
        ImageIO.write(bufferedImage, "png", file);
    } catch (IOException e) {
        e.printStackTrace();
    }

标签: javagraphics2d

解决方案


转换应该在您希望受到它们影响的任何操作之前应用,转换不会影响在它之前完成的任何操作......

BufferedImage bufferedImage = new BufferedImage(408, 408, BufferedImage.TYPE_INT_RGB);
// Create a graphics which can be used to draw into the buffered image
Graphics2D g2d = bufferedImage.createGraphics();
g2d.rotate(Math.toRadians(90));
List<Pixel> pixels = cacheRepo.findAll();
pixels.stream().forEach(pixel -> {
    g2d.setColor(getColorFromPixel(pixel));
    g2d.fillRect(getPos(pixel.getPosition().x), getPos(pixel.getPosition().y), 20, 20);
});
//g2d.rotate(Math.toRadians(90));
// Not sure what you're hoping to achieve here
//g2d.drawRenderedImage(bufferedImage, null);
g2d.dispose();

如果您愿意,请使用两个BufferedImages. 将“正常”内容渲染到第一个,然后使用第二个来绘制第一个,但是使用旋转变换......因为变换让我头疼

使用您的代码绘制黑色图像

您可能需要提供一个可以围绕其旋转图像的锚点,否则它将被评为左上角

你会原谅我的,但这种想法以前不是没有被问过的


推荐阅读