1

J'ai besoin d'une fonction comment est capable de construire une image basée sur plusieurs fusions. Alors je fais ceComment faire un traitement d'image pour utiliser tous les 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); 
} 

} Mais c'est plus lent à ce que je dois ... Je dois presque 5-8sec pour exécuter toutes mes images et de créer le résultat. Donc je pense ... si je vais le faire fonctionner sur plusieurs noyaux simultanés, ce qui augmentera ma vitesse. Par exemple .. J'ai 4 core, si je peux pour diviser ma liste originale d'éléments dans la liste 4 et avec d'eux aura seulement un quart ou une liste originale, ceux-ci peuvent exécuter chacun d'eux sur un seul noyau, et après tout sera fini je peux fusionner juste 4 images sur un. Mais je n'ai aucune idée de comment faire ça ... Alors s'il vous plaît les gars, si quelqu'un d'entre vous sait comment faire, s'il vous plaît montrez-moi: D

Thx et désolé pour moi mauvais anglais.

+1

Quelle partie vous n'avez aucune idée comment faire; tout? Êtes-vous capable de partitionner la liste en établissant des index? – ChiefTwoPencils

+0

Je n'ai aucune idée de comment utiliser les discussions pour faire cela ... J'ai la recherche sur internet allot ... Mais je n'ai pas trouvé de solution sur la façon de le faire avec des discussions .. – cavaler12345

+0

Vous n'avez pas besoin utiliser des threads pour partitionner la liste. Vous voudriez faire cela avant de créer les quatre threads. Ensuite, vous passez une référence à la liste partagée et aux indices dont le thread est responsable. Vous avez probablement plus d'une question ici parce que c'est trop large. – ChiefTwoPencils

Répondre

0

Solve était vraiment simple, j'ai juste besoin d'utiliser parallelStream et travailler tous beaucoup jeûné

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

C'était tout ce que je dois