2017-09-28 4 views
1

Ich habe eine Bilddatei (jpg) und ich muss es drehen. Ich möchte jedoch vermeiden, es erneut zu komprimieren, wenn es auf der Festplatte gespeichert wird. Ist das möglich?Wie kann man ein Bild drehen und speichern, ohne es erneut zu komprimieren?

ich speichern Sie das Bild wie folgt aus:

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

Haben Sie etwas versuchen – UltimateDevil

+0

Wie Sie speichern diese einen Code eingeben, damit können wir Ihnen helfen, besser – UltimateDevil

+0

@VikasTiwari: done, aktualisiert ich die Frage – noa

Antwort

0

Vielleicht können Sie versuchen, die Daten aus dem Bitmap zu einem Byte-Array zu extrahieren und das Array speichern. (Code nicht getestet, vielleicht funktioniert es nicht).

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

Verwenden Sie PNG anstelle von JPG. Das PNG-Format ist ein verlustfreies Datenformat mit Komprimierung. 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(); 


Oder Sie können Compressor-Bibliothek verwenden, webp Format zu verwenden.
WEBP unterstützt sowohl verlustfrei als auch verlustfrei. 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

nein, png wird um 3 die Größe der Originaldatei + es dauert etwa 7 Sekunden Speichern Sie die Datei :( WebP ist eine gute Alternative, aber warum 75 als Qualität und nicht 80? 90? 95? – noa

+0

@noa Qualität von WEBP, es ist 100. Ich nur kopieren und einfügen Beispiel von der Github-Website und ich nur korrigiert es. –

+0

@noa Darüber hinaus benötigen Sie API 14 oder höher, um WEBP zu verwenden. https://stackoverflow.com/questions/19308831/android-javal-lang-nosuchfielderror-android-graphics-bitmapcompressformat-web –

Verwandte Themen