2016-10-22 2 views
0

Je dois enregistrer une image jpeg sans perte. Je travaille sur un projet de stéganographie mais Java compresse et sauvegarde mon résultat. Je fais des recherches sur tous les forums et j'essaie tout mais ça n'a pas marché.Comment enregistrer jpg sans perte dans Java?

Voici mon exemple de code pour enregistrer une image sans perte jpeg:

BufferedImage image = ImageIO.read(new File("sources/image.jpg")); 

ImageWriter writer = ImageIO.getImageWritersByFormatName("JPEG").next(); 
JPEGImageWriteParam jpegParams = new JPEGImageWriteParam(null); 

jpegParams.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); 
jpegParams.setCompressionQuality(1f); 

writer.setOutput(ImageIO.createImageOutputStream(new File("example.jpg"))); 
writer.write(null, new IIOImage(image,null,null), jpegParams); 
writer.dispose(); 

Après ce processus je calcule la valeur PSNR est 28,53173 et "example.jpg « taille de est plus grand que » image.jpg ".

J'essaie d'importer la bibliothèque JAI mais je ne suis pas sûr que Java 8 supporte JAI.

+0

Pouvez-vous partager plus de détails sur votre algorithme afin que nous puissions comprendre pourquoi votre jpeg doit être sans perte? Il se peut que jpeg ne soit pas le bon format pour votre algorithme, ou que vous deviez encoder votre image stego d'une manière spécifique. Lisez [ici] (https://stackoverflow.com/questions/29677726/steganography-in-lossy-compression-java/29678676#29678676) pour un exemple. – Reti43

+0

Tout d'abord merci pour votre réponse. Mon algorithme est très simple. Texte/image à binaire, lire l'image de couverture, RGB à YCbCr, séparer 8x8 blocs pour l'espace Y, DCT pour tous les blocs, et que le réglage LSB du coefficient maximum de la fréquence moyenne. Après tout IDCT, YCbCr à RGB et enregistrer. Je dois le faire dans l'application Android et je dois lire JPEG écrire JPEG. – vakkaya

+1

Avez-vous basé votre algorithme sur une publication que vous pouvez nous montrer? Si vous lisez un fichier JPEG, vous n'avez pas besoin de reconstruire les pixels à partir des données du fichier. Chargez simplement les blocs DCT dans la mémoire, modifiez-les selon votre algorithme, puis réencodez-les dans le fichier de sortie. De cette façon, vous évitez toutes les choses avec perte du format JPEG, ce qui implique les étapes de transformation et de quantification. – Reti43

Répondre

2

JPEG est perte tout le temps. Même avec une qualité de compression de 100%, il y aura une perte d'information, mais elle sera minimisée. La raison pour laquelle votre exemple.jpg a une plus grande taille est parce qu'il a été encodé avec un facteur de qualité de 100%, tandis que la plupart des encodeurs jpeg ont une valeur par défaut de 50% -75%, ce qui est probablement utilisé pour example.jpg. Vous pouvez essayer différents facteurs de qualité pour voir quand les deux fichiers ont la même taille.

Un format JPEG sans perte existe (disponible dans JAI), mais il doit être considéré comme un format différent du format JPEG conventionnel. Cependant, il n'est pas largement utilisé et vous ne serez probablement pas en mesure de le voir dans la plupart des applications, ce qui serait pratiquement vaincre le point de partager une image innocente.