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

发布于 2024-10-20 02:31:40 字数 1405 浏览 2 评论 0原文

我必须用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 异常。

I've to make a parallel image processing script in java, the idea is to divide the images into tiles of any size, process them, and reassemble the final image.

For now i've created a function:

public static BufferedImage readImg (String path, int startx, int starty, int w, int h)

that returns the region of an image as BufferedImage, then i'll process it and i want to place that region in the correct position of the final image.

So i've tried to make a function writeImg that uses replacePixels method to write just in the correct position without loading the whole image into memory:

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();
    }
}

The problem is that canReplacePixels is always set as false, and i've no idea what should i use to do that.

The images can be very big so it's impossible to load the whole image in memory as it will cause a OutOfMemory exception.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

樱桃奶球 2024-10-27 02:31:40

只要您愿意使用 24 位 PNG 文件作为输出,我就为您提供了一个可行的解决方案(在 GPL 许可下):

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

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

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

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

https:// /sourceforge.net/p/mobac/code/HEAD/tree/trunk/MOBAC/src/main/java/mobac/utilities/imageio/

As long as you are fine with an 24 bit PNG file as output I have a working solution for you (under GPL license):

The class PngXxlWriter allows to write PNG files "line by line". That means that you can write an image of 10000x10000 (width * height) pixels in lines of e.g. 256 pixels (10000 * 256).

Usually this reduces the memory usage down to a level which is practically.

All required classes can be found here:

PngXxlWriter is the main class. By calling its method writeTileLine you can add a new line to the output image.

https://sourceforge.net/p/mobac/code/HEAD/tree/trunk/MOBAC/src/main/java/mobac/utilities/imageio/

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文