Multithreading 如何使图像处理使用所有CPU内核

Multithreading 如何使图像处理使用所有CPU内核,multithreading,image,java-8,image-segmentation,java-threads,Multithreading,Image,Java 8,Image Segmentation,Java Threads,我需要一个函数如何能够建立一个基于多个合并的图像。所以我这么做 public static void mergeImagesByName(List<String> names) { File folder; File[] listOfFiles; List<String> allFilesName; folder = new File("images/"); listOfFiles = folder.listFiles(); allFilesName = new Ar

我需要一个函数如何能够建立一个基于多个合并的图像。所以我这么做

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);
}
公共静态void mergeImagesByName(列表名称){
文件夹;
文件[]列表文件;
列出所有文件名;
文件夹=新文件(“图像/”);
listOfFiles=folder.listFiles();
allFilesName=newarraylist();
用于(文件名:listOfFiles){
allFilesName.add(fileName.getName());
}
列出imgName=names.stream().map(name->name+=“.PNG”).collect(Collectors.toList());
List allExistingName=new ArrayList();
allfilename.stream().forEach((文件)->imgName.stream().filter((名称)->(file.equals(名称)).forEach((名称)->allExistingName.add(名称));
试一试{
File baseImage=新文件(文件夹“MERGE.PNG”);
BuffereImage textImage=ImageIO.read(新文件(文件夹,“Text.PNG”);
BuffereImage image=ImageIO.read(基本图像);
int w=800;
int h=450;
BuffereImage combined=新的BuffereImage(w,h,BuffereImage.TYPE_INT_ARGB);
Graphics g=组合的.getGraphics();
g、 drawImage(image,0,0,null);
for(字符串名称:allExistingName){
BuffereImage overlay=ImageIO.read(新文件(文件夹,名称));
g、 drawImage(覆盖,0,0,空);
write(合并的“PNG”,新文件(文件夹“MERGE.PNG”);
}
g、 drawImage(textImage,0,0,null);
}捕获(IOEX异常){
Logger.getLogger(MergeImages.class
.getName()).log(Level.SEVERE,null,ex);
}
} 但我需要的是慢一点。。。我需要5-8秒来执行所有图像并创建结果。所以我在想。。。如果我能同时在多个核心上运行,这将提高我的速度。例如我有4个核心,如果我可以将我的原始元素列表划分为4个列表,其中的元素只有四分之一或原始列表,这些元素可以在一个核心上运行每个元素,完成后,我可以在一个核心上合并4个图像。但我不知道怎么做。。。伙计们,如果你们中有人知道怎么做,请告诉我:D


Thx,对不起,我英语不好。

解决方法非常简单,我只需要使用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"));

这就是我所需要的

解决方法非常简单,我只需要使用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"));

这就是我所需要的

哪一部分你不知道怎么做;所有这些?你能通过建立索引来划分列表吗?我不知道如何使用线程来实现这一点。。。我在网上搜索过。。。但是我还没有找到任何关于如何使用线程来实现这一点的解决方案。您不需要使用线程来划分列表。在创建四个线程之前,您可能希望这样做。然后传递对共享列表的引用和线程负责的索引。这里可能有不止一个问题,因为as太宽泛了。如果您将
parallel()
添加到
allFilesName
流中,那么它将跨线程为您处理它。我不熟悉这种类型的应用程序,但是否有必要在每次迭代时编写
MERGE.PNG
文件?你能在循环中的内存中应用每个覆盖,然后在应用所有覆盖时写入文件吗?你不知道该怎么做;所有这些?你能通过建立索引来划分列表吗?我不知道如何使用线程来实现这一点。。。我在网上搜索过。。。但是我还没有找到任何关于如何使用线程来实现这一点的解决方案。您不需要使用线程来划分列表。在创建四个线程之前,您可能希望这样做。然后传递对共享列表的引用和线程负责的索引。这里可能有不止一个问题,因为as太宽泛了。如果您将
parallel()
添加到
allFilesName
流中,那么它将跨线程为您处理它。我不熟悉这种类型的应用程序,但是否有必要在每次迭代时编写
MERGE.PNG
文件?您是否可以在循环中的内存中应用每个覆盖,然后在应用所有覆盖时写入文件?