Hallo leute,
Ums kurz zu machen:
Ich habe eine Fileserver auf dem ich JPEGs Speichere. Diese sollen möglichst wenig Speicherplatz wegnehmen, was über meine App auf 50 Kb komprimiert werden soll.
Mein jetziger Code funktioniert zwar soweit, aber bei einigen Bildern wird die Qualität zu schlecht.
So sieht mein code bis hierhin aus:
Java
public static Bitmap compressBitmap(Context ctx, Bitmap bmp){
Bitmap editBmp = bmp;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
//Change Bmp x- or y-size smaller than 600
while(editBmp.getWidth() > 600 || editBmp.getHeight() > 600){
editBmp = Bitmap.createScaledBitmap(editBmp, editBmp.getWidth()/2, editBmp.getHeight()/2, false);
}
//compress without quality reduction to read bytesize
editBmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] imageInByte = baos.toByteArray();
long lengthbmp = imageInByte.length / 1000; //dividing with 1000 for Kilobytes
bmp = editBmp;
int quality = 100;
//reduce bmp bytesize with quality reduction
while(lengthbmp >= 50) {
if(quality <= 0){
break;
}
baos = new ByteArrayOutputStream();
editBmp = bmp;
quality -= 5;
editBmp.compress(Bitmap.CompressFormat.JPEG, quality, baos);
imageInByte = baos.toByteArray();
lengthbmp = imageInByte.length / 1000; //dividing with 1000 for Kilobytes
}
//Toast.makeText(ctx, quality + "\n" + String.valueOf(lengthbmp) + " kb" + editBmp.getWidth() + "x" + editBmp.getHeight(), Toast.LENGTH_SHORT).show();
return editBmp;
} catch (Exception e) {
//Toast.makeText(ctx, e.toString(), Toast.LENGTH_SHORT).show();
return null;
}
}
Alles anzeigen
Die Gründe für eine schlechte Qualität sind mir klar und im Prinzip kann ich nun rumprobieren und mit einigen Zahlen rumspielen bis es halbwegs funktioniert, aber vielleicht hat jemand einen besseren Ansatz oder sogar eine Lösung dafür.