如何在Java中调整BuffereImage的大小

如何在Java中调整BuffereImage的大小,java,bufferedimage,Java,Bufferedimage,我正在寻找在Java中调整BuffereImage大小的最简单(但仍然没有问题)的方法 在对某个问题的回答中,用户coobird提出了以下解决方案,用他的话来说(我做了非常轻微的改动): ** Graphics对象有一种方法可以在执行调整大小操作的同时绘制图像: Graphics.drawImage(Image,int,int,int,int,ImageObserver) 方法可用于在绘制时指定图像的位置和大小 因此,我们可以使用这样一段代码: BufferedImage originalIma

我正在寻找在Java中调整BuffereImage大小的最简单(但仍然没有问题)的方法

在对某个问题的回答中,用户coobird提出了以下解决方案,用他的话来说(我做了非常轻微的改动):

**

Graphics
对象有一种方法可以在执行调整大小操作的同时绘制
图像

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();
这将获取
原始图像
并将其绘制在
新图像
上,宽度和高度为
小尺寸

**

这个解决方案似乎相当简单。我有两个问题:

  • 如果我想将图像的大小调整为更大的尺寸,而不仅仅是更小的尺寸,它是否也能工作(使用完全相同的代码)

  • 这个解决方案有什么问题吗

如果有更好的方法,请提出建议。


谢谢

如果您这样设置参数,它将放大原稿。但是:你应该使用一些保留边缘的智能算法,因为简单地放大图像会使图像模糊,并且会导致感知质量下降


没问题。从理论上讲,这甚至可以在某些平台上进行硬件加速。

单步缩放的主要问题是,它们通常不会产生高质量的输出,因为它们专注于获取原始图像并压缩到更小的空间,通常会丢失大量像素信息(不同的算法做不同的事情,所以我在概括)

drawGraphics
会上下缩放吗?是的,它会有效地进行缩放还是产生高质量的输出?这些都会归结到实现上,一般来说,默认情况下使用的大多数缩放算法都注重速度。你可以用一点方式来实现这些,但一般来说,除非你在一个小范围内缩放,否则质量y通常(因我的经验)受到影响

您可以查看更多关于该主题的详细信息和讨论

一般来说,一般建议使用一个专用的库,比如,从我玩它的十分钟来看,它做得相当好,或者执行阶梯音阶

分步缩放基本上是将图像按2的幂递增或递减,直到达到所需大小。请记住,放大只不过是取一个像素并将其放大一点,因此,如果放大到非常大的尺寸,质量将始终是一个问题

例如

请记住,任何缩放通常都是一项昂贵的操作(基于图像的原始和目标大小),因此通常最好尝试在绘制过程之外以及在可能的情况下在背景中执行这些操作

还有一个问题是,您是否希望保持图像的纵横比?根据您的示例,图像将以方形方式缩放(拉伸以满足目标大小的要求),这通常是不需要的。您可以将
-1
传递给宽度或高度参数,基础算法将保持原始图像的纵横比,或者您可以简单地控制并对是否要将图像填充或适合目标区域进行更多确定,例如


一般来说,我避免在大多数情况下使用
drawImage
getScaledInstance
(如果您仅在小范围内缩放,或者希望进行低质量、快速缩放,这些都可以工作)更多地依赖于像拟合/填充目标区域和分级缩放之类的东西。使用我自己的方法的原因很简单,就是不允许总是使用外部库。很高兴不用重新发明轮子,在那里你可以

为什么放大图像会使图像模糊?放大2,2意味着使每个像素都变大两倍,但是保持相同的比例,对吗?如果是的话,那为什么会有问题呢?还有,是不是有一个内置的Java类来处理这个问题,而不是我必须想出一些算法来防止质量损失?例如:你有一个8px的图像,4个黑色像素,然后是4个白色像素。你把它放大2.2:你最终会得到8个黑色像素piels,一个灰色的和8个白色的。现有像素之间的新像素将被计算为两个现有像素的平均值,这将降低两个区域之间的对比度(边缘)。-这不是通常语言库试图解决的问题。@Prog您可以查看此问题以获得可能的开箱即用解决方案: