2017-09-28 13 views
1

J'ai un fichier image (jpg) et j'ai besoin de le faire pivoter. Cependant, je voudrais éviter de le compresser à nouveau en le sauvegardant sur le disque. Est-ce que c'est leur moyen de le faire?Comment faire pivoter une image et l'enregistrer sans la compresser à nouveau?

J'enregistrer l'image comme ceci:

matrix.setRotate(-90); 
    Bitmap bitmap = BitmapFactory.decodeFile(imagePath, options); 
    Bitmap bmRotated = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true); 
    bitmap.recycle(); 

    FileOutputStream fileoutputstream = new FileOutputStream(imagePath); 
    bmRotated.compress(CompressFormat.JPEG, 100, fileoutputstream); 
    fileoutputstream.flush(); 
    fileoutputstream.close(); 
    bmRotated.recycle(); 
+0

Avez-vous essayé quoi que ce soit – UltimateDevil

+0

Comment allez-vous économiser ce mettre un peu de code afin que nous puissions vous aider à mieux – UltimateDevil

+0

@VikasTiwari: fait, je mis à jour la question – noa

Répondre

0

Peut-être que vous pouvez essayer d'extraire les données de votre bitmap à un tableau d'octets et enregistrer ce tableau. (Code non testé, peut-être que cela ne fonctionne pas).

Bitmap bitmap = new Bitmap()... 
int width = bitmap.getWidth(); 
int height = bitmap.getHeight(); 

int size = bitmap.getRowBytes() * bitmap.getHeight(); 
ByteBuffer byteBuffer = ByteBuffer.allocate(size); 
bitmap.copyPixelsToBuffer(byteBuffer); 
byte[] byteArray = byteBuffer.array(); 

FileOutputStream output = new FileOutputStream("filename"); 
output.write(byteArray); 
output.close(); 
0

Utilisez le format PNG au lieu du format JPG. Le format PNG est un format de données sans support avec compression. https://en.wikipedia.org/wiki/Portable_Network_Graphics

matrix.setRotate(-90); 
Bitmap bitmap = BitmapFactory.decodeFile(imagePath, options); 
Bitmap bmRotated = Bitmap.createBitmap(bitmap, 0, 0, 
bitmap.getWidth(), bitmap.getHeight(), matrix, true); 
bitmap.recycle(); 

FileOutputStream fileoutputstream = new FileOutputStream(imagePath); 
bmRotated.compress(CompressFormat.PNG, 100, fileoutputstream); 
fileoutputstream.flush(); 
fileoutputstream.close(); 
bmRotated.recycle(); 


Ou, vous pouvez utiliser la bibliothèque compresseur, pour utiliser le format WebP.
WEBP prend en charge à la fois sans perte et perte. https://en.wikipedia.org/wiki/WebP

https://github.com/zetbaitsu/Compressor

compressedImage = new Compressor(this) 
     .setMaxWidth(640) 
     .setMaxHeight(480) 
     .setQuality(100) 
     .setCompressFormat(Bitmap.CompressFormat.WEBP) 
     .setDestinationDirectoryPath(Environment.getExternalStoragePublicDirectory(
      Environment.DIRECTORY_PICTURES).getAbsolutePath()) 
     .compressToFile(actualImage); 
+0

non, png va augmenter de 3 la taille du fichier d'origine + il faut environ 7 secondes pour enregistrer le fichier :( WebP est une bonne alternative, mais pourquoi 75 comme qualité et non 80? 90? 95? – noa

+0

@noa qualité de WEBP, il est 100. Je viens de copier et coller l'exemple du site github, et je –

+0

@noa De plus, vous avez besoin de l'API 14 ou supérieure pour utiliser WEBP https://stackoverflow.com/questions/19308831/android-java-lang-nosuchfielderror-android-graphics-bitmapcompressformat-web –