【问题标题】:Image turns black after resizing Java Swing调整 Java Swing 大小后图像变黑
【发布时间】:2014-06-03 15:15:19
【问题描述】:

好的,我正在设计一个与迷宫相关的游戏,现在我正在处理 GUI。

考虑到它将是 NxN 维度,我必须根据屏幕尺寸调整图像(迷宫的内容)的大小,因此无论迷宫大小如何,它都不会受到影响。

我使用了这段代码:

public static BufferedImage resizeImage(Image image, int width, int height) {
       BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
       return bufferedImage;
    }

但是有一个问题。新调整大小的图像现在是黑色(完全黑色),即使它已正确调整大小(尺寸方面)。

我做错了什么?提前致谢。

【问题讨论】:

  • 你可能会try instead, answered here
  • 您只创建了一个新的空 BufferedImage - 没有复制和缩放旧图像的代码。
  • @Arvind 见The Perils of Image.getScaledInstance()。另外,输入“you”这个词的所有 3 个个字母有那么难吗?
  • @ErwinBolwidt 提出了一个很好的观点。 OTOH,我可能会在绘制图像时缩放图像,在Graphics2D 对象上使用仿射变换(调整大小)和一些渲染提示(使其看起来更漂亮)。
  • BTW - "..resize 图片.." 这些图片是否包含透明度?如果是这样,BufferedImage.TYPE_INT_RGB 应该是 BufferedImage.TYPE_INT_ARGB

标签: java image swing resize bufferedimage


【解决方案1】:

以下是如何添加代码以在您创建的新位图上绘制图像的缩放版本:

public static BufferedImage resizeImage(Image image, int width, int height) {
    BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    Graphics2D g = bufferedImage.createGraphics();

    // Increase quality if needed at the expense of speed
    g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BICUBIC);
    g.setRenderingHint(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);

    AffineTransform scaleTransform = AffineTransform.getScaleInstance(
            width / (double) image.getWidth(null), height / (double) image.getHeight(null));
    g.drawImage(image, scaleTransform, null);

    // Release resources
    g.dispose();

    return bufferedImage;
}

【讨论】:

  • 不错! +1 实际上,我对这个问题的评论,在我提交之前已经在屏幕上停留了很长时间,现在几乎看起来是多余的 - 除了在绘画时调整它的大小的想法..顺便说一句 - g.drawImage(image, scaleTransform, null); 最好是 @987654323 @..
  • 不错的编辑。 :) 你让我希望我能再次投票。我向 OP 询问了一个关于透明度的问题,并意识到更强大的方法是使用原始(必须缓冲的)图像的 BufferedImage.TYPE_..
  • 成功了。但背景是黑色的。你能告诉我如何避免它吗?为了解决我的问题,背景应该是透明的,但它显示为黑色。请帮忙
  • BufferedImage.TYPE_INT_RGB 没有 Alpha 通道,因此它没有透明度。使用BufferedImage.TYPE_INT_ARGB 添加 alpha 通道并支持透明度。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-24
  • 2010-12-18
  • 2014-09-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-12
  • 1970-01-01
相关资源
最近更新 更多