【问题标题】:How to obtain a resized BufferedImage如何获得调整大小的 BufferedImage
【发布时间】:2015-03-18 16:36:51
【问题描述】:

假设我有 2 张 TIF 图像,我将其中一张读入 BufferedImage 实例:

ImageReader reader = ImageIO.getImageReadersByFormatName("tif").next();
reader.setInput(inputStream, false);   // inputStream is the first image.
BufferedImage bufferedImage = reader.read(0);

现在我想创建一个新的BufferedImage而不读取其他图像。它应该与前一个相同,但大小不同。 imageType 对于 TIF 图像似乎为 0,但以下不起作用。

BufferedImage largeBufferedImage = new BufferedImage(newWidth, newHeight, 0);

有没有办法克隆现有的BufferedImage 并且只改变它的大小?

顺便说一句,我希望能够为任何图像格式做到这一点。如果可能的话,我不想处理像imageType 这样的细节。

【问题讨论】:

  • 但以下不起作用。 -- 为什么不呢?有什么问题?
  • @Thomas 对于tif 图像,它不接受“0”作为有效的imageType。

标签: java image awt bufferedimage javax.imageio


【解决方案1】:
BufferedImage deepCopy(BufferedImage bi)/*method to clone BufferedImage*/ {
   ColorModel cm = bi.getColorModel();
   boolean isAlphaPremultiplied = cm.isAlphaPremultiplied();
   WritableRaster raster = bi.copyData(null);
   return new BufferedImage(cm, raster, isAlphaPremultiplied, null);
}
BufferedImage newImg = deepCopy(oldImg);//clone it
Graphics2D g = newImg.createGraphics();
g.drawImage(newImg, 0, 0, width, height, null);//newImg will be resized

【讨论】:

  • 不会改变我原来的bufferedImage吗?我不想改,我想复制。
  • 我无法理解bufferedImage 和originalImage 之间的区别。如果它们是同一个东西,那就不行了。
  • 对不起,我犯了一些错误。我都修好了。
  • 几乎所有 - 只是您的第一行中缺少一个括号(它已移至评论 ^^)
  • @Jeremy 这并不完全有效,但我找到了使用您的一些代码的解决方案。所以我赞成你的回答 :) 问题是你必须改变光栅来调整图像的大小。 drawImage() 不会成功...
【解决方案2】:

当您在paint 方法中绘制时,您可以添加更多参数来拉伸和缩放图像,请参阅g.drawImage 在此link。

【讨论】:

    【解决方案3】:

    经过反复试验,我找到了解决问题的有效方法。

    private BufferedImage copyAndResize(BufferedImage source, int width, int height)
    {
        ColorModel cm = source.getColorModel();
        boolean isAlphaPremultiplied = cm.isAlphaPremultiplied();
        WritableRaster raster = source.copyData(null);
        SampleModel sm = raster.getSampleModel().createCompatibleSampleModel(width, height);
        WritableRaster newRaster = WritableRaster.createWritableRaster(sm, null);
        BufferedImage newBi = new BufferedImage(cm, newRaster, isAlphaPremultiplied, null);
        return newBi;
    }
    

    【讨论】:

    • 这比您实际需要的要复杂得多。请看以下描述几个选项的文章:today.java.net/pub/a/today/2007/04/03/…
    • @BrettOkken 为什么我的代码很复杂?你应该知道我只是想得到一个BufferedImage 实例来写一个新的图像。我根本不关心它的内容/质量,我只关心它的大小和属性。
    猜你喜欢
    • 2014-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多