ArrayList没有添加BufferedImage?

时间:2017-01-06 22:31:01

标签: java arraylist save bufferedimage

我将BufferedImages添加到我的ArrayList有一个问题,它添加了它们,但是,我更好地展示了一些代码:

        }
            }
        }
        this.listOfLines.add(this.image.getSubimage(xMin, yMin, xMax, yMax - yMin));
        this.image = fillWhite(xMin, yMin, xMax, yMax, this.image);
        isWhite = white(this.image);
    }
    saveLines();
}

private void saveLines() {
    for(int i = 0; i < this.listOfLines.size(); i++){
        save(this.listOfLines.get(i), i);
    }
}

这是出现问题的代码段。 (之前和之后的代码无关紧要,只知道有一个BufferedImage,我在循环中剪切了一些子图像(这里我找到文本行并希望将它们添加到listOfLines ArrayList中),然后填充原始图像的区域白色,但在将子图像添加到列表后!)。底部的save方法只是获取BufferedImage并将其保存到特定路径,仅用于检查目的,我不想稍后保存所有内容,因为这将是太多图像。

问题:如果我现在将一个Image添加到listOfLines ArrayList并立即保存,然后将原始图像中的区域填充为白色,然后在文件夹中查找它,它完美地运行。但是在显示的代码中,问题是如果我在将原始图像添加到arraylist后直接将原始图像填充为白色,那么arraylist中的图像是白色的...但是为什么?

保存每个子图像时的代码(其中n是保存的第n个图像):

}
        this.listOfLines.add(this.image.getSubimage(xMin, yMin, xMax, yMax - yMin));
        save(this.image.getSubimage(xMin, yMin, xMax, yMax - yMin), n);
        this.image = fillWhite(xMin, yMin, xMax, yMax, this.image);
        isWhite = white(this.image);
    }

希望我描述的准确:/希望你可以帮助我或建议另一种方式。我的计划B将保存文件夹中的每个图像,然后在arrayList中再次读取每个图像并使用该图像,但这会浪费我的力量;)

问候

修改

好的,整个裁员代码是:

    public void cutLines(){
    boolean isWhite = false;

    while(!isWhite){

        int yMin = 0;
        int yMax = 0;
        int xMin = 0;
        int xMax = this.image.getWidth();
        boolean finished = false;
        boolean active = false;
        boolean lineWhite = false;

        for(int i = 0; i < this.image.getHeight(); i++){
            if(!finished){
                if(!active){
                    for(int j = 0; j < this.image.getWidth(); j++){
                        if(this.image.getRGB(j, i) == Color.BLACK.getRGB()){
                            active = true;
                            yMin = i;
                        }
                    }
                } else if(active){
                    lineWhite = true;
                    for(int j = 0; j < this.image.getWidth(); j++){
                        if(this.image.getRGB(j, i) == Color.BLACK.getRGB()){
                            lineWhite = false;
                        }
                    }

                    if(lineWhite){
                        active = false;
                        yMax = i;
                        finished = true;
                    }
                }
            }
        }
        this.listOfLines.add(this.image.getSubimage(xMin, yMin, xMax, yMax - yMin));
        this.image = fillWhite(xMin, yMin, xMax, yMax, this.image);
        isWhite = white(this.image);
    }
    saveLines();
}

private void saveLines() {
    for(int i = 0; i < this.listOfLines.size(); i++){
        save(this.listOfLines.get(i), i);
    }
}

如果有人想要自己测试它,它需要一个黑白图像(只需绘制和键入2/3行文本)。如果您将最后一行更改为:

listOfLines.add(this.image.getSubimage(xMin, yMin, xMax, yMax - yMin));
        save(this.image.getSubimage(xMin, yMin, xMax, yMax - yMin), n);
        n++;
        this.image = fillWhite(xMin, yMin, xMax, yMax, this.image);
        isWhite = white(this.image);

它为我保存了正确的图像。但是在上面的代码中只有ArrayList中的白色图像。

1 个答案:

答案 0 :(得分:2)

您是否看过BufferedImage.getSubImage()实际上做了什么?

  

返回的BufferedImage与原始数据库共享相同的数据数组   图像。

如果确实希望稍后保存,create a copy