2016-12-31 167 views
0

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

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(调整)在postition(老位置*调整因素)。(希望这是一个很好的说明)。 但是但是,它不工作,我只得到零:( 有人能告诉我要修改什么,或给我一个算法的其他例子?(不管它有多快,只要我能理解它)

(我真的希望它不是转发,因为我真的不能f IND另一个问题/解决方案,目的是在阵列调整:/)

问候:)

+1

我不是在图像方面的专家,但我认为你会对此有所倒退。试着将'i'和'j'在从0到100的'resized'索引上迭代。然后使用缩放因子将'resize [i] [j]'设置为'img'中的一个像素。 –

+0

这个问题是否重复? http://stackoverflow.com/questions/9417356/bufferedimage-resize –

+0

即使你“真的需要数组”(我不明白为什么,从你的代码中),它会*更快*只是使用' AffineTransformOp'并使用'TYPE_NEAREST_NEIGHBOR'向下采样图像。如果需要,您仍然可以从生成的图像中获取支持数组。 – haraldK

回答

1

让我们来看看您的问题仅在一个维度。对于宽度的原始图像中的每一列iowidth您要查找的列ii在宽度nwidth的新形象,你的情况100。您计算ii这样的:

ii = i * (nwidth/owidth); 

的公式在原则上是好的,但括号确保首先计算配给nwidth/owidth。因为你缩小比例,这个比例小于1。因为无论nwidthowidth是整数,该师是一个整数除法,其结果也必须是整数。在这里,它是零。

您可以通过两种方式解决这个问题:使部门的浮点除法:

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

或只是删除括号,这样乘法首先发生:

ii = i * nwidth/owidth; 

(有,溢出的危险时,你的图像是非常大的,但在你的情况,这不应该是一个问题)

最后,詹姆斯·诺克斯·波尔克是正确的:你有逻辑错误的方式圆钢d。使用for循环访问新图像的每个像素,并从旧图像中为新图像中的每个像素选取一个源像素。 (这也意味着比率是相反的。)

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

+0

非常感谢你!真的帮助我:) – Mechamod

相关问题