Le moyen le plus rapide pour lire/écrire des Images à partir d'un Fichier dans un BufferedImage?
- Quel est le moyen le plus rapide de lire des Images à partir d'un Fichier dans un BufferedImage en Java/Graal?
- Quel est le moyen le plus rapide pour graver des Images à partir d'un BufferedImage dans un Fichier en Java/Graal?
ma variante (lecture):
byte [] imageByteArray = new File(basePath+imageSource).readBytes()
InputStream inStream = new ByteArrayInputStream(imageByteArray)
BufferedImage bufferedImage = ImageIO.read(inStream)
ma variante (écriture):
BufferedImage bufferedImage = //some image
def fullPath = //image page + file name
byte [] currentImage
try{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write( bufferedImage, "jpg", baos );
baos.flush();
currentImage = baos.toByteArray();
baos.close();
}catch(IOException e){
System.out.println(e.getMessage());
}
}
def newFile = new FileOutputStream(fullPath)
newFile.write(currentImage)
newFile.close()
OriginalL'auteur | 2013-08-29
Vous devez vous connecter pour publier un commentaire.
Votre solution pour lire, c'est essentiellement la lecture des octets à deux reprises, une fois à partir du fichier et une fois de la
ByteArrayInputStream
. Ne pas le faireAvec Java 7 pour lire
Avec Java 7 pour écrire
L'appel à
Files.newInputStream
sera de retour d'uneChannelInputStream
qui (à ma connaissance) n'est pas mis en mémoire tampon. Vous aurez envie de l'envelopperDe sorte qu'il ya moins de IO appels sur le disque, selon la façon dont vous l'utiliser.
Je suis désolé, je ne suis pas familier avec l'INTERFACE utilisateur de progiciels.
Ceux-ci sont Java 7 classes. Package
java.nio.file.Files
etjava.nio.file.Paths
.Un un-buffered
FileInputStream
va faire beaucoup de IO OS appels de lire le disque. Par la mise en mémoire tampon, vous l'avez lu plus que vous avez besoin afin de rendre moins les appels vers le disque. Dans des situations comme ça, ça fait sens, parce que vous finirez par la lecture de l'ensemble du dossier de toute façon.Utilisez le raccourci
BufferedOutputStream
de la même façon.OriginalL'auteur Sotirios Delimanolis
Je suis en retard à la fête, mais de toute façon...
En fait, à l'aide de:
et
...pourrait s'avérer plus rapide (de l'essayer, à l'aide d'un profileur, assurez-vous).
C'est parce que ces variantes
RandomAccessFile
adossés à desImageInputStream
/ImageOutputStream
implémentations en coulisse, tandis que lesInputStream
/OutputStream
versions par défaut, utilisez un disque adossés à des seekable flux de mise en œuvre. Le disque de support implique l'écriture de l'ensemble du contenu du flux dans un fichier temporaire et, éventuellement, de la lecture de celui-ci (c'est parce que l'image I/O souvent les avantages de la non-linéaires d'accès aux données).Si vous voulez éviter des e/S supplémentaires avec le flux de données en fonction des versions, le coût de l'utilisation de la mémoire, il est possible d'appeler d'une manière ambiguë, nommé
ImageIO.setUseCache(false)
, pour désactiver la mise en cache disque de la seekable les flux d'entrée. Ce n'est évidemment pas une bonne idée si vous êtes aux prises avec de très grandes images.En théorie, oui (en supposant que le paramètre par défaut pour
useCahce
false
). Mais comme je le dis, mesure pour en être sûr. 🙂Juste pour le fun, j'ai écrit un programme exemple, que lire un moyen JPEG de taille 100 fois à l'aide de la version du fichier, le flux de la version et les flux version sans le cache disque. Les Timings sont des délais moyens. le temps à l'aide de fichier: 36.76 ms de temps à l'aide de flux: 40.32 ms de temps à l'aide de flux (useCache==false): 37.63 ms JDK 1.6.0_26-b03-383 sur OS X, 2,66 GHz i7 + SSD. Votre kilométrage peut varier...
Ne lire et à écrire avec ImageIO de BufferedImages change quoi que ce soit sur la qualité de l'image?
La question est: Lorsque je charge une image jpg dans un BufferedImage et enregistrez-le à partir de ce BufferedImage à un fichier jpg est-ce le fruit de perte de qualité?
OriginalL'auteur haraldK
Vous êtes presque bon pour l'écriture. Il suffit de ne pas utiliser l'intermédiaire ByteArrayOutputStream. C'est un énorme goulot d'étranglement dans votre code. Au lieu de cela envelopper le FileOutputStream dans un BufferedOutputStream et faire de même.
En va de même, en effet, pour votre lecture. Supprimer la Itermediate ByteArrayInputStream.
OriginalL'auteur Martijn Courteaux