ArrayList 不添加 BufferedImage?

Posted

技术标签:

【中文标题】ArrayList 不添加 BufferedImage?【英文标题】:ArrayList doesnt add BufferedImage? 【发布时间】:2017-01-06 22:31:01 【问题描述】:

我在将 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中),然后将原始图像的区域填充为白色,但在将子图像添加到列表之后!)。底部的保存方法只是获取一个 BufferedImage 并将其保存到特定路径,仅用于检查目的,我不想稍后保存所有内容,因为那样会太多图像。

问题:如果我现在将图像添加到 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 中只有白色图像。

【问题讨论】:

"The code before and after doesnt matter..." -- 也许对你来说不是,但对我们大多数人来说是这样。您正在发布代码 sn-ps,我们无法运行或测试任何内容,这使我们很难完全理解您的问题或您的问题。如果您非常需要一个体面的答案,请考虑通过创建和发布有效的minimal reproducible example/sscce 来改进您发布的代码。回复前请检查链接。 【参考方案1】:

你看过BufferedImage.getSubImage()实际上做了什么吗?

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

如果您真的想稍后保存,create a copy。

【讨论】:

感谢您的建议,以前不知道!可悲的是,这对我也不起作用,无论我尝试什么都会遇到很多错误 @Mechamod 对不起,我链接了错误的答案(在子图像上使用时失败)。请看***.com/a/26894825/3931225

以上是关于ArrayList 不添加 BufferedImage?的主要内容,如果未能解决你的问题,请参考以下文章

arraylist和linkedlist重大区别?

为啥不将 FirebaseDatabase 引用中的所有数据都添加到 ArrayList<String> 中?

添加到 ArrayList 对象的 ListIterator

集合篇-ArrayList源码解析

当您在不指定对象类型的情况下创建 ArrayList 时,它会在您添加第一个对象时自动创建它吗?

在二维 ArrayList 中添加元素