我需要一个函数如何基于多个合并构建图像。所以我这样做
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
对不起,我很抱歉英语不好。答案 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"));
这就是我需要的一切