- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在寻找在 Java 中调整 BufferedImage 大小的最简单(并且仍然没有问题)的方法。
在对某个问题的一些回答中,用户 coobird 用他的话(我稍作改动)提出了以下解决方案:
**
Graphics
对象有一个方法来绘制 Image
同时执行调整大小操作:
Graphics.drawImage(Image, int, int, int, int, ImageObserver)
方法可用于在绘制时指定位置以及图像的大小。
所以,我们可以使用这样一段代码:
BufferedImage originalImage = // .. created somehow
BufferedImage newImage = new BufferedImage(SMALL_SIZE, SMALL_SIZE, BufferedImage.TYPE_INT_RGB);
Graphics g = newImage.createGraphics();
g.drawImage(originalImage, 0, 0, SMALL_SIZE, SMALL_SIZE, null);
g.dispose();
这将采用 originalImage
并将其绘制在宽度和高度为 SMALL_SIZE
的 newImage
上。
**
这个解决方案看起来相当简单。我有两个问题:
如果我想将图像的大小调整为<em>更大,而不只是更小,它是否也能工作(使用完全相同的代码)?
这个方案有什么问题吗?
如果有更好的方法,欢迎提出。
谢谢
最佳答案
单步缩放的主要问题是它们通常不会产生高质量的输出,因为它们专注于获取原始图像并将其压缩到较小的空间中,通常是通过丢弃大量像素信息(不同的算法做不同的事情,所以我在概括)
drawGraphics
是否会按比例放大和缩小,是的,它会有效地完成还是产生高质量的输出?这些将归结为实现,一般来说,默认使用的大多数缩放算法都专注于速度。您可以稍微影响这些,但一般来说,除非您在小范围内缩放,否则质量通常会受到影响(根据我的经验)。
可以看看The Perils of Image.getScaledInstance()有关该主题的更多详细信息和讨论。
一般来说,一般推荐的是要么使用专用库,比如imgscalr ,从我玩过的十分钟来看,它做得很好或执行了阶梯音阶。
阶梯缩放基本上是将图像按 2 的次方递增或递减,直到达到所需的大小。请记住,放大只是将一个像素放大一点,因此如果放大到非常大的尺寸,质量将始终是一个问题。
例如……
请记住,任何缩放通常都是一项代价高昂的操作(基于图像的原始大小和目标大小),因此通常最好尝试在绘制过程之外并尽可能在后台执行这些操作。
还有一个问题,要不要保持图片的纵横比?根据您的示例,图像将以正方形方式缩放(拉伸(stretch)以满足目标尺寸的要求),这通常是不需要的。您可以将 -1
传递给 width 或 height 参数,底层算法将保持原始图像的纵横比,或者您可以简单地控制并做出更多决定是要填充还是适合图像到目标区域,例如...
一般来说,我大部分时间都避免使用 drawImage
或 getScaledInstance
(如果你只在一个小范围内缩放或者想要做一个低质量、快速的缩放,这些可以工作)并且更多地依赖于诸如适合/填充目标区域和逐步缩放之类的东西。使用我自己的方法的原因简单地归结为并不总是被允许使用外部库。很高兴不必在可以的地方重新发明轮子
关于java - 如何在 Java 中调整 BufferedImage 的大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22054383/
我是一名优秀的程序员,十分优秀!