调整数组大小

4

我需要使用数组将给定的图片缩小一半。但我不知道从哪里开始。我被提供了一个函数。

public static int[][] resizeImage(int[][] original, int newWd, int newHt) 

我需要使用二维数组将像素从原始图像映射到新图像。不确定是否提供了足够的信息。我不想要答案,只需要提示或起点,因为我甚至不知道如何开始。


数组的内容需要做什么? - matt b
你应该进行子采样、平均值或其他操作吗? - Paul Tomblin
我认为你的内部循环条件有 bug。第一个条件并没有错,但通常写成:i < newWd(不带 <= 且不减去 1)。 - Juan Pablo Califano
听起来像是一个有趣而有趣的任务,如果你正在使用普通位图并可以在图像编辑器中查看结果。 - Michael Petrotta
@Paul:根据下面一个回答中OP的评论,听起来是普通的最近邻插值。 - Michael Petrotta
3个回答

15
假设一个100x100的图像,如果你在[0,0]处有一个蓝色像素,在[99][99]处有一个红色像素,在调整大小后,你期望这些像素会出现在哪里?

2
那是一个非常好的答案。你怎么得到[49][49]的?现在,假设你还有一个黄色像素在[98,98]处。它会出现在哪里? - Tony Ennis
1
我通过将99除以2得到了49,由于它是一个整数,所以结果就是49。98也变成了49,49。嗯,有趣。这样对吗? - Snowman
2
它正在获取[i][j]处的像素,并将它们分配给新图像中的[i...哦等等..嗯..好吧,我们不应该只为将其缩小一半而创建此函数,而是应该使用newWd和newHt缩放到任何给定的尺寸。那么我们首先需要找到原始尺寸和新尺寸之间的比率,以知道在哪里放置新像素吗? - Snowman
1
我之前不知道 - original.length 给出数组的一个维度。我不确定是哪个。original[0].length 给出另一个维度。太好了。 - Tony Ennis
2
不用谢。我很高兴能帮忙,希望您学到了很多。我得去睡觉了,明天有重要的工作日! - Tony Ennis
显示剩余28条评论

3
在一张纸上画一个4x4的网格,用红、绿、蓝和黑色中的一种颜色涂每个正方形。现在画一个8x8的网格,并想象如何将第一个网格中的图片复制到第二个网格中。注意原始图片中的哪个正方形被复制到目标图片的哪个正方形,并尝试将其推广为一种算法。
显然,第一个网格是“original”数组,第二个网格是你返回的数组。
你的老师有没有告诉你应该如何调整图片大小?如果没有,你可能只想“放大像素”,这样每个正方形就可以直接复制到一个2x2的网格(四个正方形)。你可以使用非常复杂的调整大小算法(例如抗锯齿),但我建议从简单开始。

他说:“提示:在0... newWidth-1和0.. newHeight-1之间使用两个嵌套的for循环。 //提示:您可以仅使用相对比例来计算原始图像中的x(或y坐标)。 //例如,如果您正在设置新图像的中间像素,则应该在原始图像中读取一半的距离。” - Snowman
@fprime:听起来第二个提示就是我所描述的(“让像素变大”)。如果允许非整数调整大小(例如将一个10x10的图像调整为14x14),那就更有趣了。 - Michael Petrotta

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接