gpt4 book ai didi

java - BufferedImage调整算法

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:15:39 24 4
gpt4 key购买 nike

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

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(已调整大小)的位置(旧位置 * 调整大小因子)。(希望这是一个很好的描述)。但是,它不起作用,我只得到零:(有人可以告诉我要修改什么或给我一个算法的其他示例吗? (多快无所谓,只要我能看懂)

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

问候:)

最佳答案

让我们从一个维度来看您的问题。对于每一列 i在宽度的原始图像中 owidth你想找到列 ii在宽度的新图像中 nwidth ,在你的情况下是 100。你计算 ii像这样:

ii = i * (nwidth / owidth);

公式原则上是好的,但是括号保证了配给nwidth / owidth首先计算。因为你按比例缩小,所以这个比率小于一。因为两者都是nwidthowidth是整数,除法是整数除法,其结果也必须是整数。在这里,它是零。

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

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

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

ii = i * nwidth / owidth;

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

最后,James K Polk 是对的:你把逻辑弄错了。使用 for 访问新图像的每个像素循环并从旧图像中为新图像中的每个像素选择一个源像素。 (这也意味着比例是相反的。)

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

关于java - BufferedImage调整算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41408891/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com