【发布时间】:2021-10-25 03:45:39
【问题描述】:
我正在尝试使用并行计算从 BufferedImage 获取像素的 int[]。更具体地说,我将图像从宽度分成 64 位的块并计算每个部分的像素。我使用并行计算的主要原因是我正在开发一个视频播放器,我想使用多线程来解析帧像素。
通常,您可以使用以下代码轻松获取所有像素:
(1a)
final int width = image.getWidth();
final int[] pixels = image.getRGB(0, 0, width, image.getHeight(), null, 0, width );
但是,就我而言,我尝试使用IntStream 和parallel() 方法来帮助并行化该过程:
(1b)
public static int[] getRGBFast(@NotNull final BufferedImage image) {
final int width = image.getWidth();
final int height = image.getHeight();
final int[] rgb = new int[width * height];
final int num = width / 64;
final int leftover = width - num * 64;
IntStream.range(0, num + (width % 64 == 0 ? 0 : 1))
.parallel()
.forEach(chunk -> {
final int pixel = chunk << 6;
if (chunk == num) {
image.getRGB(pixel, 0, leftover, height, rgb, 0, width);
} else {
image.getRGB(pixel, 0, 64, height, rgb, 0, width);
}
});
return rgb;
}
比较(1a) 和(1b) 的结果时,似乎几乎所有像素都放错了位置。我使用以下代码来比较两个数组:
for (int i = 0; i < rgb.length; i++) {
final int color = rgb[i];
final int old = original[i];
if (color != old) {
System.out.printf("Index: %d mismatch [%d,%d]%n", i, color, old);
}
}
最后几千行的结果are as follows。它后面还有更多行显示像素不匹配。在视觉方面,我运行了 10 次代码并显示了它的图像。出于一个奇怪的原因,每次迭代的结果似乎都不同:
作为参考,原图如下:
我不确定我的算法在哪里存在缺陷。谁能指出我遇到的可能问题?
【问题讨论】:
-
不应该
scansize是width? -
@tgdavies 我在这里有点困惑。我被告知它通常应该是宽度。就我而言,我正在处理 64 位宽度的块,因此我将其设置为 64。但是对于剩余部分,我将其设置为剩余部分。如果我将它设置为宽度,我会得到奇怪的结果。
-
w和h指的是图像中的区域,但scansize只是rgbArray的名义宽度。 -
@tgdavies 嗯。我试过了,现在似乎已经填满了整个数组,但是,比较时有些像素不匹配。也许我在某个地方多次填充一个像素?
-
请用您的新代码更新您的问题并说明哪些像素不匹配。
标签: java parallel-processing bufferedimage