将小图像合并为一个而不在内存中分配完整图像

时间:2011-03-04 16:21:39

标签: java image-manipulation

我要在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异常。

1 个答案:

答案 0 :(得分:2)

只要您使用24位PNG文件作为输出就可以了,我有一个可行的解决方案(根据GPL许可证):

PngXxlWriter类允许“逐行”写入PNG文件。这意味着您可以在例如几行中写入10000x10000(宽*高)像素的图像。 256像素(10000 * 256)。

通常这会将内存使用量降低到实际水平。

所有必需的课程都可以在这里找到:

PngXxlWriter是主类。通过调用方法writeTileLine,您可以在输出图像中添加新行。

https://trekbuddyatlasc.svn.sourceforge.net/svnroot/trekbuddyatlasc/trunk/MOBAC/src/main/java/mobac/utilities/imageio