2011-05-19 5 views
2

Comme on peut le voir ci-dessous j'ai 1ère image une image JPEG originale .Deuxième un tampon a été prise à l'image et que enregistrer à l'aide http://www.lac.inpe.br/JIPCookbook/6040-howto-compressimages.jsp avec 1,0 qualité. L'image fixe est devenue plus petite en taille et une très petite déformation. Est-il possible de sauvegarder l'image à sa qualité telle qu'elle est? Pleas pas que sauver l'image telle qu'elle était était juste un exemple de test. Après avoir ajouté du texte, je l'enregistre avec la plus haute qualité, ce qui perd également de l'information.Java Enregistrement original JPEG sans perte

enter image description here

enter image description here

Répondre

1

JPEG, même avec les paramètres de qualité les plus élevés, est toujours lossy, même si l'image d'origine les données proviennent d'un JPEG.

Certaines opérations comme la rotation/la mise en miroir/la recadrage peuvent être effectuées sans perte sur un fichier JPEG (à l'aide d'outils tels que jpegtran), mais il s'agit d'exceptions rares.

Quoi qu'il en soit, il semble que vous avez accès à l'image JPG original et vous ne changez pas, donc je ne comprends pas pourquoi vous compressez à nouveau. Si vous avez vraiment besoin de stocker ces images sans perte, le meilleur choix serait d'utiliser le mode sans perte de JPEG2000, cela donne une taille de fichier plus petite que d'autres alternatives comme PNG pour les données d'image qui a été compressé en utilisant JPG (bien qu'il soit encore beaucoup plus grand que le JPG original). Par exemple, pour le premier de vos exemples d'images:

hAw2d.jpg -> 268,678 bytes (Original) 
hAw2d.jp2 -> 1,021,007 bytes (JPEG 2000, lossless) 
hAw2d.png -> 1,213,392 bytes (PNG) 
+0

Ceci est juste un test que j'ai fait pour l'échantillon. Je sauve le jpg avec la qualité 1.0 après avoir fait une certaine opération. Qui réduit la taille –

6

Ne pas redessiner l'image et l'enregistrer. Copiez simplement les octets bruts à la place!


Je soupçonnez que votre code actuel est quelque chose comme ceci:

BufferedImage image = ImageIO.read(new File("my.jpg"); 
ImageIO.write(image, "jpg", new File("copy.jpg")); 

Chaque fois que vous répétez cette image changera un peu (comme vous avez vu perdre toujours une certaine qualité). Si vous voulez seulement copier le fichier JPEG/sans changer tout ce que vous pouvez faire quelque chose comme ça (cette page http://www.exampledepot.com/egs/java.io/CopyFile.html):

void copy(File src, File dst) throws IOException { 
    InputStream in = new FileInputStream(src); 
    OutputStream out = new FileOutputStream(dst); 

    // Transfer bytes from in to out 
    byte[] buf = new byte[1024]; 
    int len; 
    while ((len = in.read(buf)) > 0) { 
     out.write(buf, 0, len); 
    } 
    in.close(); 
    out.close(); 
} 
+0

En effet. Il existe un format jpg sans perte, mais il augmentera considérablement la taille du fichier. Si vous avez un fichier jpg et que vous voulez le garder tel quel, ne le faites pas, utilisez simplement les données d'octets. – GolezTrol

+0

Ceci est juste un test que j'ai fait pour l'échantillon. Je sauve jpg avec la qualité 1.0 après avoir fait un peu d'opération. Qui réduit la taille. –

Questions connexes