【问题标题】:Java: Slow image scaleJava:缓慢的图像比例
【发布时间】:2015-02-15 04:50:07
【问题描述】:

我在java中使用这个代码:

    Image img = ImageIO.read(new File("imagepath/file.png").getScaledInstance(300, 300,        BufferedImage.SCALE_SMOOTH);

    BufferedImage buffered = new BufferedImage(300, 300, BufferedImage.SCALE_FAST);
    buffered.getGraphics().drawImage(img, 0, 0 , null);

    ByteArrayOutputStream os = new ByteArrayOutputStream();
    ImageIO.write(buffered, "png", os); 
    InputStream in = new ByteArrayInputStream(os.toByteArray());
    return in;

这成功缩小并使用我的笔记本电脑在浏览器中显示缩略图。但是,当我在我的迷你服务器(Raspberry Pi)上启动它时,速度非常慢。更准确的是加载实际全分辨率图像的时间大约 4 倍。

谁能告诉我这怎么可能? 300x300

干杯!

【问题讨论】:

  • 您是否将调整大小的图像保存在某处?如果没有,您基本上每次请求图像时都会重做调整大小操作。请注意,1280x720 .jpg 图像需要约 2.7 兆内存才能以原始位图格式存储在内存中。 Pi 并不完全是系统的速度恶魔。
  • 因为 Raspberry Pi 的处理器比您的笔记本电脑慢得多,并且调整图像大小是一项处理器密集型操作。
  • @MarcB 哇 2.7MB!?真的那么糟糕吗 :S 有没有办法让它更无缝地融入流或缓存要走的路?
  • 1280x720 = 921,600 像素。 24 位图像 = 3 字节/像素,因此 921,600 * 3 = ~2.65meg。

标签: java webserver raspberry-pi image-scaling image-size


【解决方案1】:

众所周知,getScaledInstance 很慢,有关详细说明,请参阅例如 this article

请注意,您的

BufferedImage buffered = new BufferedImage(300, 300, BufferedImage.SCALE_FAST);

行错了,这里对于第三个参数你应该指定图像类型(TYPE_INT_RGB、TYPE_INT_ARGB、TYPE_INT_ARGB_PRE 等)而不是 SCALE_FAST(它甚至不是 BufferedImage 中的字段)

另见:How to scale a BufferedImage

有关质量缩减,请参阅:Quality of Image after resize very low -- Java

【讨论】:

  • 谢谢!奇怪的是代码之前工作并且没有崩溃。猜测它使用了一些默认值,因为我发送的那个完全错误。
  • 仅供参考 - 一步缩放通常不会产生很好的结果(尤其是在大范围内),通常最好使用步进方法,for example
  • @MadProgrammer 是的,这实际上也在“The Perils of Image.getScaledInstance()”一文(在“On-the-Fly Scaling”部分)中进行了详细讨论,但为了完整性我还在答案中包含了您的链接
猜你喜欢
  • 1970-01-01
  • 2015-06-04
  • 2014-04-09
  • 2021-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-17
相关资源
最近更新 更多