1

我需要一個函數如何能夠建立一個基於多重合並的圖像。所以我做這個如何使圖像處理使用所有的CPU核心

public static void mergeImagesByName(List<String> names) { 
File folder; 
File[] listOfFiles; 
List<String> allFilesName; 

folder = new File("images/"); 
listOfFiles = folder.listFiles(); 

allFilesName = new ArrayList<>(); 
for (File fileName : listOfFiles) { 
    allFilesName.add(fileName.getName()); 
} 

List<String> imgName = names.stream().map(name -> name += ".PNG").collect(Collectors.toList()); 
List<String> allExistingName = new ArrayList<>(); 

allFilesName.stream().forEach((file) -> imgName.stream().filter((name) -> (file.equals(name))).forEach((name) -> allExistingName.add(name))); 
try { 
    File baseImage = new File(folder, "MERGE.PNG"); 
    BufferedImage textImage = ImageIO.read(new File(folder, "Text.PNG")); 
    BufferedImage image = ImageIO.read(baseImage); 
    int w = 800; 
    int h = 450; 
    BufferedImage combined = new BufferedImage(w, h, BufferedImage.TYPE_INT_ARGB); 

    Graphics g = combined.getGraphics(); 
    g.drawImage(image, 0, 0, null); 

    for (String name : allExistingName) { 
     BufferedImage overlay = ImageIO.read(new File(folder, name)); 
     g.drawImage(overlay, 0, 0, null); 
     ImageIO.write(combined, "PNG", new File(folder, "MERGE.PNG")); 
    } 
    g.drawImage(textImage, 0, 0, null); 

} catch (IOException ex) { 
    Logger.getLogger(MergeImages.class 
      .getName()).log(Level.SEVERE, null, ex); 
} 

} 但它是慢了什麼,我需要...我需要幾乎5-8sec執行我的所有圖像和創造的結果。所以我在想......如果我會讓它在多核同時運行,這會提高我的速度。例如..我有4個核心,如果我可以將我原來的元素列表分成4個列表,並且他們將只有四分之一部分或原始列表,這些可以在一個核心上運行它們中的每一個,並且在之後所有將完成我可以合併一個4只圖像。但我不知道該怎麼做......所以請大家,如果你們中的任何人知道如何做到這一點,請告訴我:D

Thx對不起我英語不好。

+1

你沒有哪一部分的任何想法怎麼辦;所有的?你能否通過建立索引來劃分列表? – ChiefTwoPencils

+0

我不知道如何使用線程來做到這一點...我在互聯網上搜索配置...但我找不到任何有關如何與線程做到這一點的解決方案.. – cavaler12345

+0

你不需要使用線程來分割列表。在創建四個線程之前,你需要這樣做。然後你會傳遞一個對共享列表和線程負責的索引的引用。你可能在這裏有不止一個問題,因爲它太寬泛了。 – ChiefTwoPencils

回答

0

的解決是非常簡單的,我只需要使用parallelStream和所有工作變得禁食

allExistingName.parallelStream().forEach(name -> { 
    BufferedImage overlay = images.get(name); 
    g.drawImage(overlay, 0, 0, null); 
}); 
ImageIO.write(combined, "PNG", new File(folder, "MERGE.PNG")); 

這是所有我需要的

相關問題