Android – Bildgröße reduzieren

Ich habe eine URI-Bilddatei, und ich möchte seine Größe reduzieren, um sie hochzuladen. Die anfängliche Bilddateigröße hängt von Mobile bis Mobile ab (kann 2MB sein, wie es 500KB sein kann), aber ich möchte, dass die endgültige Größe etwa 200KB beträgt, damit ich sie hochladen kann.
Von dem, was ich gelesen habe, habe ich (mindestens) 2 Entscheidungen:

  • Verwenden Sie BitmapFactory.Options.inSampleSize , um das Originalbild zu entfernen und ein kleineres Bild zu erhalten.
  • Mit Bitmap.compress komprimieren Sie das Bild, das die Komprimierungsqualität angibt.

Was ist die beste Wahl?

  • Wie definiere und benutze eine System-Eigenschaft in Android Instrumentation Test?
  • Wie kann ich Links in einem TextView anklicken?
  • Android Studio - Ambiguous Methode rufen getClass ()
  • Android NDK: load_library: kann nicht gefunden werden srand
  • Android ListView schnell scrollen mit Abschnitten: Abschnitt Text zu lang
  • Entfernen Sie alle Tabellenzeilen aus der SQLite-Datenbanktabelle

  • Ich dachte daran, zunächst die Bildbreite / -höhe zu vergrößern, bis Breite oder Höhe über 1000px liegt (so etwas wie 1024×768 oder andere), dann komprimiere das Bild mit abnehmender Qualität, bis die Dateigröße über 200KB liegt. Hier ist ein Beispiel:

    int MAX_IMAGE_SIZE = 200 * 1024; // max final file size Bitmap bmpPic = BitmapFactory.decodeFile(fileUri.getPath()); if ((bmpPic.getWidth() >= 1024) && (bmpPic.getHeight() >= 1024)) { BitmapFactory.Options bmpOptions = new BitmapFactory.Options(); bmpOptions.inSampleSize = 1; while ((bmpPic.getWidth() >= 1024) && (bmpPic.getHeight() >= 1024)) { bmpOptions.inSampleSize++; bmpPic = BitmapFactory.decodeFile(fileUri.getPath(), bmpOptions); } Log.d(TAG, "Resize: " + bmpOptions.inSampleSize); } int compressQuality = 104; // quality decreasing by 5 every loop. (start from 99) int streamLength = MAX_IMAGE_SIZE; while (streamLength >= MAX_IMAGE_SIZE) { ByteArrayOutputStream bmpStream = new ByteArrayOutputStream(); compressQuality -= 5; Log.d(TAG, "Quality: " + compressQuality); bmpPic.compress(Bitmap.CompressFormat.JPEG, compressQuality, bmpStream); byte[] bmpPicByteArray = bmpStream.toByteArray(); streamLength = bmpPicByteArray.length; Log.d(TAG, "Size: " + streamLength); } try { FileOutputStream bmpFile = new FileOutputStream(finalPath); bmpPic.compress(Bitmap.CompressFormat.JPEG, compressQuality, bmpFile); bmpFile.flush(); bmpFile.close(); } catch (Exception e) { Log.e(TAG, "Error on saving file"); } 

    Gibt es einen besseren Weg, es zu tun? Soll ich versuchen, alle 2 Methoden oder nur eins zu benutzen? Vielen Dank

  • Testen mit UI-Elementen in der Android-Ansicht
  • Für Android Map api v2 Beschreibung references nicht vorhandene library google-play-services_lib \ bin \ google-play-services_lib.jar
  • Android: BitmapFactory.decodeByteArray gibt pixelige Bitmap
  • Können wir startActivityForResult vom Adapter anrufen?
  • Popup über eingehenden Anrufbildschirm
  • Anruf Audio Stream Modifikation in Android 4.0 ICS
  • 2 Solutions collect form web for “Android – Bildgröße reduzieren”

    Mit Bitmap.compress() spezifizieren Sie einfach den Komprimierungsalgorithmus und die Kompressionsoperation dauert ziemlich viel Zeit. Wenn Sie mit Größen für die Verringerung der Speicherzuweisung für Ihr Bild spielen müssen, müssen Sie genau die Skalierung Ihres Bildes mit Bitmap.Options , Bitmap-Schranken zuerst berechnen und dann auf Ihre angegebene Größe Bitmap.Options .

    Die beste Probe, die ich auf StackOverflow gefunden habe, ist diese .

    Die meisten Antworten, die ich gefunden habe, waren nur Stücke, die ich zusammenstellen musste, um einen Arbeitscode zu bekommen , der unten gepostet wird

      public void compressBitmap(File file, int sampleSize, int quality) { try { BitmapFactory.Options options = new BitmapFactory.Options(); options.inSampleSize = sampleSize; FileInputStream inputStream = new FileInputStream(file); Bitmap selectedBitmap = BitmapFactory.decodeStream(inputStream, null, options); inputStream.close(); FileOutputStream outputStream = new FileOutputStream("location to save"); selectedBitmap.compress(Bitmap.CompressFormat.JPEG, quality, outputStream); outputStream.close(); long lengthInKb = photo.length() / 1024; //in kb if (lengthInKb > SIZE_LIMIT) { compressBitmap(file, (sampleSize*2), (quality/4)); } selectedBitmap.recycle(); } catch (Exception e) { e.printStackTrace(); } } 

    2 Parameter sampleSize und Qualität spielt eine wichtige Rolle

    SampleSize wird verwendet, um das Originalbild zu subsample und gibt ein kleineres Bild zurück , dh
    SampleSize == 4 gibt ein Bild zurück, das 1/4 der Breite / Höhe des Originals entspricht.

    Qualität wird verwendet, um den Kompressor zu sagen , der Eingangsbereich liegt zwischen 0-100. 0 Bedeutung Kompresse für kleine Größe, 100 Bedeutung Kompresse für maximale Qualität

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.