Nat*_*ate 3 java multithreading javax.imageio
我正在尝试将RGB值的字节数组保存为png图像,如下所示:
byte[] imgArray = ...;
int canvasSize = 512;
ColorModel c = new ComponentColorModel(ColorSpace.getInstance(ColorSpace.CS_GRAY), null, false, false, Transparency.OPAQUE, DataBuffer.TYPE_BYTE);
Image image = Toolkit.getDefaultToolkit().createImage(
new MemoryImageSource(canvasSize, canvasSize, c, imgArray, 0, canvasSize));
BufferedImage bimage = new BufferedImage(canvasSize, canvasSize, BufferedImage.TYPE_BYTE_GRAY);
// Draw the image on to the buffered image
Graphics2D bGr = bimage.createGraphics();
bGr.drawImage(image, 0, 0, null); //This is what takes all the time
bGr.dispose();
ImageIO.write(bimage, "PNG", new File(uniqueFileName));
Run Code Online (Sandbox Code Playgroud)
我正在使用FixedThreadpool同时保存多个图像.我使用的线程越多(最多我的计算机上的可用核心数),保存过程所需的时间就越长.在6个线程上运行所需的时间几乎是在一个线程上运行的两倍.
为什么多线程需要这么长时间?内存交换?我可以避免这个问题吗?
另外,如果我有更好的方法从阵列中保存png,请告诉我.
编辑显示图片被保存为不同的图像,而不是相互覆盖.
我认为这是由不同类型的优化引起的.您试图在一个路径中一次保存多个图像 - 这意味着需要排队保存操作 - 这是一个IO绑定任务,而不是CPU绑定.多个保存线程在这里可能不是很有帮助.同样在非常小的(就CPU功率要求而言)操作中,委托线程来完成工作可能只会产生额外的开销,从而导致完成任务所需的时间延长,而不是缩短.希望这可以帮助 :)
| 归档时间: |
|
| 查看次数: |
275 次 |
| 最近记录: |