Bonjour,
J'ai un soucis avec des input/outputStreams.
Je travaille sur un programme permettant de compresser/decompresser des images au format médicale. L'algo est le suivant :
L'image A etant compréssé d'un certain format.
- on decompresse A et on obtient B en raw
- on compresse B dans le format voulut et on obtient C
J'ai pu récupérer du code permettant de faire tout ça mais utilisant des FileInput/outputstream. Ce qui ma choqué c'est que cela oblige a sauvegardé chaque étape (B et C) dans un fichier et donc sur le disque dur plutôt que de garder le tout en ram. Pour moi le fait d'accéder au disque dur est énormément couteux en temps j'ai donc voulut modifier tout ça en n'utilisant uniquement la ram.
Pour cela j'ai remplacé les FileStream par des ByteArrayStream mais cela a pour effet d'être encore plus long !! il y a donc quelquechose que je ne saisis pas.
Mon deuxième problème est que lorsque j'ai voulut utiliser des PipedStream j'ai été bloqué car finalement peut importe le stream utilisé au depart il est convertit en ImageStream. Il m'est donc impossible de récupérer l'input car l'output est copié dans un ImageStream.
Voici du code pour illustrer mes dire :
au depart :
avec ma modif
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 File f = new File(Path); File decompress = File.createTempFile("img",".dcm"); File imgFinal = File.createTempFile("imgFinal",".dcm"); TranscoderMain.launchCompression('d', "100", f, decompress); TranscoderMain.launchCompression(comp, quality, decompress, imgFinal);
la fonction launchCompression
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7 File f = new File(Path); FileInputStream fis = new FileInputStream(file); ByteArrayOutputStream out = new ByteArrayOutputStream(); ByteArrayOutputStream outFinal = new ByteArrayOutputStream(); TranscoderMain.launchCompression('d', "100", fis, out); TranscoderMain.launchCompression(comp, quality, new ByteArrayInputStream(out.toByteArray()), outFinal);
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 public static int launchCompression(char c, String quality, InputStream is, OutputStream os){ try { setInput(this.iis = ImageIO.createImageInputStream(is)); setOutput(this.ios = ImageIO.createImageOutputStream(os)); (...) }
Donc je pense fortement que le problème vient des ImageStream mais il doit bien y avoir un moyen d'optimisé cela sans passé par des accès disques totalement inutile.
Merci D'avance.
Partager