2017-01-06 66 views
-4

我有增加BufferedImages到我的ArrayList的問題,以及它增加了他們,但是,還有更好的我展示一些代碼:ArrayList不添加BufferedImage?

 } 
      } 
     } 
     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並立即保存,則將原始圖像中的區域填充爲白色,然後在文件夾中查看它,它完美地工作。但在顯示的代碼中,問題是如果我在將原始圖像添加到數組列表後直接填充原始圖像,那麼數組列表中的圖像是白色的......但是爲什麼?

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

希望我描述它準確:

保存每個子圖像(其中n是保存第n個圖像)時,其工作方式代碼/希望你能幫助我,或建議另一種方式。我的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中只有白色圖像。

+0

''前後的代碼無關緊要......「' - 也許不是你,但它對我們大多數人都有用。您發佈的代碼片段,我們無法運行或測試,因此很難完全理解您的問題或您的問題。如果您非常需要正確的答案,請考慮通過創建併發布有效的[mcve]/[sscce](http://sscce.org)來改進您發佈的代碼。回覆前請檢查鏈接。 –

回答

2

你看過BufferedImage.getSubImage()究竟做了什麼嗎?

返回的BufferedImage與原始的 圖像共享相同的數據數組。

如果你真的保存在以後,create a copy

+0

謝謝你的建議,以前不知道!可悲的是,這並不適用於我,無論我嘗試什麼 – Mechamod

+0

@Mechamod都會得到很多錯誤對不起,我鏈接了錯誤的答案(在子圖像上使用時失敗)。請參閱http://stackoverflow.com/a/26894825/3931225 – KompjoeFriek

+0

非常感謝!完美的作品! – Mechamod