我要在java中制作并行图像处理脚本,其目的是将图像划分为任意大小的图块,处理它们,然后重新组合最终图像。
现在我已经创建了一个功能:
public static BufferedImage readImg (String path, int startx, int starty, int w, int h)
将图像区域作为BufferedImage返回,然后我将处理它,我想将该区域放在最终图像的正确位置。
所以我试图创建一个函数writeImg,它使用replacePixels方法在正确的位置写入而不将整个图像加载到内存中:
public static void writeImg (String path, int startx, int starty, BufferedImage image){
File output = new File(path);
ImageOutputStream ios = null;
try {
ios = ImageIO.createImageOutputStream(output);
} catch (IOException e){
e.printStackTrace();
}
Iterator iter = ImageIO.getImageWritersByFormatName("JPEG");
ImageWriter writer = (ImageWriter)iter.next();
writer.setOutput(ios);
try{
if(writer.canReplacePixels(0)){
System.out.println("True");
}else{
System.out.println("False");
}
}catch (IOException e) {
e.printStackTrace();
}
ImageWriteParam param = writer.getDefaultWriteParam();
Point destinationOffset = new Point(startx,starty);
param.setDestinationOffset(destinationOffset);
try {
writer.replacePixels(image, param);
} catch (IOException e) {
e.printStackTrace();
}
}
问题是canReplacePixels总是设置为false,我不知道应该用它做什么。
图像可能非常大,因此无法将整个图像加载到内存中,因为它会导致OutOfMemory异常。
答案 0 :(得分:2)
只要您使用24位PNG文件作为输出就可以了,我有一个可行的解决方案(根据GPL许可证):
PngXxlWriter类允许“逐行”写入PNG文件。这意味着您可以在例如几行中写入10000x10000(宽*高)像素的图像。 256像素(10000 * 256)。
通常这会将内存使用量降低到实际水平。
所有必需的课程都可以在这里找到:
PngXxlWriter是主类。通过调用方法writeTileLine
,您可以在输出图像中添加新行。