2017-05-26 4 views
0

J'ai un fichier JPEG de taille 2550x3300 (ce fichier a été créé avec le niveau de qualité 90). La taille physique du fichier est de 2,5 Mo. Je voudrais redimensionner cette image à 1288x1864 (50% de la dimension originale) et enregistrer avec la même qualité 90. Mais je veux savoir la taille physique de l'image échantillonnée vers le bas à l'avance, avant même de faire l'échelle réelle vers le bas.Prédiction de la taille d'une image réduite

Toute aide est appréciée!

Voici le code que je utilise,

` 
//Decodes the existing file to bitmap 
Bitmap srcBP = BitmapFactory.decodeFile(filePath, options); 
//Calculates required width and height 
int reqWidth = options.outWidth * .50; 
int reqHeight = options.outHeight * .50; 
//Creates scaled image 
Bitmap outBP = Bitmap.createScaledBitmap(srcBP, reqWidth, reqHeight, false); 
//Save modified as JPEG 
File tempFile = new File(imageOutPath); 
FileOutputStream out = new FileOutputStream(tempFile); 
outBP.compress(Bitmap.CompressFormat.JPEG, compression, out); 
out.close(); 
` 

Répondre

0

est difficile de prédire la taille de l'image après la compression, car la compression dépend du contenu réel de l'image, des images compriment à plus petite taille que d'autres encore ils ont les mêmes dimensions. L'approche que je suggère est d'essayer de compresser l'image en mémoire comme un tableau d'octets, puis d'obtenir la taille de ce tableau et ce serait la taille du fichier donner ou prendre quelques octets. Ce code pris d'une autre réponse et modifié un peu à vos besoins: Java BufferedImage JPG compression without writing to file

ByteArrayOutputStream compressed = new ByteArrayOutputStream(); 
ImageOutputStream outputStream = 
ImageIO.createImageOutputStream(compressed); 
ImageWriter jpgWriter = 
ImageIO.getImageWritersByFormatName("jpg").next(); 
ImageWriteParam jpgWriteParam = jpgWriter.getDefaultWriteParam(); 
jpgWriteParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); 
jpgWriteParam.setCompressionQuality(0.9f); 
jpgWriter.setOutput(outputStream); 
int reqWidth = options.outWidth * .50; 
int reqHeight = options.outHeight * .50; 
BufferedImage img = new BufferedImage(reqWidth , reqHeight, BufferedImage.TYPE_INT_ARGB);; 
try { 
    img = ImageIO.read(new File(filepath)); 
} catch (IOException e) { 
} 

jpgWriter.write(null, new IIOImage(img, null, null), jpgWriteParam); 
jpgWriter.dispose(); 
byte[] jpegData = compressed.toByteArray() 

Maintenant jpegData.size() sera très proche de la taille de l'image en octets.