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

时间:2016-05-08 00:58:59

标签: 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 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-8秒来执行我的所有图像并创建结果。所以我在想......如果我能让它同时运行多核心,那将提高我的速度。例如..我是4核心,如果我可以将我原来的元素列表分成4个列表并且它们只有四分之一部分或原始列表,这些可以在一个核心上运行它们,毕竟我完成后我可以合并4张图片。但我不知道怎么做...所以请大家,如果你们中的任何一个人知道怎么做,请告诉我:D

对不起,我很抱歉英语不好。

1 个答案:

答案 0 :(得分: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"));

这就是我需要的一切