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

这是所有我需要的

相关问题