sinnvolle Bitmap Komprimierung gesucht

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • sinnvolle Bitmap Komprimierung gesucht

    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-Quellcode

    1. public static Bitmap compressBitmap(Context ctx, Bitmap bmp){
    2. Bitmap editBmp = bmp;
    3. ByteArrayOutputStream baos = new ByteArrayOutputStream();
    4. try {
    5. //Change Bmp x- or y-size smaller than 600
    6. while(editBmp.getWidth() > 600 || editBmp.getHeight() > 600){
    7. editBmp = Bitmap.createScaledBitmap(editBmp, editBmp.getWidth()/2, editBmp.getHeight()/2, false);
    8. }
    9. //compress without quality reduction to read bytesize
    10. editBmp.compress(Bitmap.CompressFormat.JPEG, 100, baos);
    11. byte[] imageInByte = baos.toByteArray();
    12. long lengthbmp = imageInByte.length / 1000; //dividing with 1000 for Kilobytes
    13. bmp = editBmp;
    14. int quality = 100;
    15. //reduce bmp bytesize with quality reduction
    16. while(lengthbmp >= 50) {
    17. if(quality <= 0){
    18. break;
    19. }
    20. baos = new ByteArrayOutputStream();
    21. editBmp = bmp;
    22. quality -= 5;
    23. editBmp.compress(Bitmap.CompressFormat.JPEG, quality, baos);
    24. imageInByte = baos.toByteArray();
    25. lengthbmp = imageInByte.length / 1000; //dividing with 1000 for Kilobytes
    26. }
    27. //Toast.makeText(ctx, quality + "\n" + String.valueOf(lengthbmp) + " kb" + editBmp.getWidth() + "x" + editBmp.getHeight(), Toast.LENGTH_SHORT).show();
    28. return editBmp;
    29. } catch (Exception e) {
    30. //Toast.makeText(ctx, e.toString(), Toast.LENGTH_SHORT).show();
    31. return null;
    32. }
    33. }
    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.
  • Hi,

    einen Ansatz im Quell-Code kann ich jetzt leider nicht geben, aber ....zumindest mal auf die Schnelle einen Denkansatz...
    Die Qualität steigt und sinkt doch mit der Ausgangsmaterial. Wenn Du jetzt also im Vorfeld wissen würdest, welche Qualität das Ausgangsmaterial hat (EXIF auslesen ??), dann könntest du ja auch individuell mit der Kompression reagieren....theoretisch.
    Korrigier mich einer bitte, wenn ich falsch liege....

    Gruß Carsten
    Humor ist....wenn man trotzdem lacht :saint:
  • hallo, so wie ich die deinen Code deute. Scrallierst du deine Bilder erstmal um die Hälfte der Seitenlänge. Eine weitere Reduzierung machst du nur mit der verlustbehafteten jpg komprimierung. Das die Qualität der Bilder bei einer zu starken komprimierung leitet ist klar. Da würde ich erstmal etwas starker scralieren und dann weniger !komprimieren.

    Wie gross sind eigentlich die Bilder?
    Wo sollen die Bilder später an gezeigt werdenden?
    Würde es der Display Pixel Grösse anpassen.

    Toad ich kenne leider keinen exif eintrag der mir die Bild Qualität mitteilt. Wenn du die Pixel Größe und die Datei Größe in eine Relation setzst könnte dies eine sehr grobe Beurteilung sein .kommt immer auf denn Bildinhalt an viele kleine Details gleich grosse Datei.
    Ein Feedback auf Tipps ist auch schön. :P
  • Ok .. ;) falsch ausgedrückt. Ich meinte mit Qualität die Auflösung. Je höher, desto besser die Qualität, aber auch desto mehr zum komprimieren.
    Und je nach Auflösung, kann man dann auch die Komprimierung anpassen...
    Aber ich sehe, du hast meinen Gedankengang richtig aufgeschnappt ;)
    Wie gesagt, sollte nur ein theoretischer Ansatz sein.

    Gruß Carsten
    Humor ist....wenn man trotzdem lacht :saint: