BufferedImage调整大小算法

时间:2016-12-31 13:53:58

标签: java algorithm resize bufferedimage

我无法找到解决问题的方法,希望你能帮到我。我有一个缓冲图像(例如img),我想调整它(使用其像素数组)以恰好适合100px(100 x 100)。我找到的所有解决方案都只是在绘图时“拉伸”图像,但我真的需要数组。 我想到了一个算法并尝试了这个:

BufferedImage resized = new BufferedImage(100,100,BufferedImage.TYPE_INT_ARGB);
        for(int i = 0; i < img.getWidth(); i++){
            for(int j = 0; j < img.getHeight(); j++){
                resized.setRGB(i*(100/img.getWidth()), j*(100/img.getHeight()), img.getRGB(i, j));
            }
        }

我无法解释它(嗯,不是英文)它做了什么,但我认为你可以很容易地看到它(对于原始图像中的每个像素(img),将它放在新的BufferedImage(调整大小)中(旧位置*调整大小因素)。(希望这是一个很好的描述)。 但是,它不起作用,我只得到零:( 有人可以告诉我要修改什么或给我一个算法的另一个例子吗? (无论多快,只要我能理解它)

(我真的希望它不是转发,因为我真的找不到另一个针对数组调整大小的问题/解决方案:/)

问候:)

1 个答案:

答案 0 :(得分:1)

让我们只在一个方面看你的问题。对于宽度为i的原始图片中的每列owidth,您希望在宽幅ii的新图片中找到列nwidth,在您的情况下为100.您计算{ {1}}像这样:

ii

该公式原则上是好的,但括号确保首先计算定量ii = i * (nwidth / owidth); 。由于缩小比例,因此该比率小于1。因为nwidth / owidthnwidth都是整数,所以除法是整数除法,其结果也必须是整数。这里是零。

您可以通过两种方式解决此问题:将该部门设为浮点除法:

owidth

或者只是删除括号,以便首先进行乘法运算:

ii = i * (1.0 * nwidth / owidth);

(当你的图像非常大时,存在溢出的风险,但在你的情况下,这不应该是一个问题。)

最后,James K Polk是对的:你的逻辑是错误的。使用ii = i * nwidth / owidth; 循环访问新图像的每个像素,并从旧图像中为新图像中的每个像素选择一个源像素。 (这也意味着比率相反。)

该逻辑对于放大和缩小都是一个重要的原则:您必须为每个目标像素选择一个源像素。放大时,您最终会多次使用相同的源像素;缩小时,您跳过一些源像素。这是一种快速,直接(但不是必需的高质量)缩放算法。