it-swarm.com.de

mit bitmap.compress (Bitmap.CompressFormat.PNG, 0, fOut) wird die Bildgröße größer als das Original

Ich möchte das von einer Kamera aufgenommene Bild in das PNG-Format komprimieren, um es kleiner zu machen.

compressedPictureFile = new File(imagePath);
Bitmap bitmap = BitmapFactory.decodeFile(imagePath);
FileOutputStream fOut = new FileOutputStream(compressedPictureFile);
boolean compressed = bitmap.compress(Bitmap.CompressFormat.PNG, 0, fOut);
fOut.flush();
fOut.close();

Das Problem ist, dass die Datei compressPictureFile tatsächlich größer ist als das Originalbild (von 1 MB bis 6 MB).

Was fehlt mir? Und ist dies der beste Weg, um die Größe eines Bildes zu reduzieren?

Vielen Dank

17
Dany Y

Die mit der Kamera aufgenommenen Bilder werden höchstwahrscheinlich im jpg - Format gespeichert, das verlustbehaftet ist, aber für Bilder mit vielen Farben (z. B. Fotos) relativ gut ist. 

Wenn Sie die Bitmap mit Ihrer Methode komprimieren, speichern Sie sie als png . Die PNG-Komprimierung ist verlustfrei, kann jedoch mit wenigen Farben (z. B. in bestimmten Logos oder anderen Grafiken) recht kleine Dateigrößen erreichen. Wenn die Anzahl der Farben und die Komplexität in einer PNG-Datei zunimmt, nimmt auch die Dateigröße zu (aus diesem Grund speichert die Kamera ein JPG - das Verhältnis von Qualität und Dateigröße ist bei den meisten Fotos viel besser als PNG).

Wenn Sie also die Dateigröße der Fotos verringern möchten, verwenden Sie die JPG-Komprimierung und experimentieren Sie mit dem Qualitätsparameter. Möglicherweise möchten Sie auch die Auflösung der Bilder verringern, da dadurch viel Speicherplatz gespart wird (eine Datei mit einer Auflösung von 50% hat eine Datengröße von ca. 25%).

24
Jave

es funktioniert gut mit meiner App

    public static String makeScreen(View view) throws Exception {
    String filename = "file.png";
    view.setDrawingCacheEnabled(true);
    view.buildDrawingCache();
    Bitmap b = view.getDrawingCache();
    FileOutputStream file = null;

    try {
        file = new FileOutputStream(Environment.getExternalStorageDirectory().toString() + "folder/" + filename);
        if (file != null) {
            b.compress(Bitmap.CompressFormat.PNG, 98, file);
            file.close();
        }
        view.destroyDrawingCache();
    } catch (Exception e) { view.destroyDrawingCache(); }
}