9

在 Android 上,如何以 30% 的质量将图像文件保存为 JPEG?

在标准 Java 中,我会使用ImageIO将图像读取为BufferedImage,然后使用IIOImage实例将其保存为 JPEG 文件:http ://www.universalwebservices.net/web-programming-resources/java/adjust-jpeg-image-compression -quality-when-saving-images-in-java。但是,Android 似乎缺少该javax.imageio软件包。

4

4 回答 4

19

您可以通过调用 compress 并设置第二个参数以 JPEG 格式存储位图:


    Bitmap bm2 = createBitmap();
    OutputStream stream = new FileOutputStream("/sdcard/test.jpg");
    /* Write bitmap to file using JPEG and 80% quality hint for JPEG. */
    bm2.compress(CompressFormat.JPEG, 80, stream);

于 2011-01-02T18:10:06.757 回答
4
InputStream in = new FileInputStream(file);
try {
    Bitmap bitmap = BitmapFactory.decodeStream(in);
    File tmpFile = //...;
    try {
        OutputStream out = new FileOutputStream(tmpFile);
        try {
            if (bitmap.compress(CompressFormat.JPEG, 30, out)) {
                { File tmp = file; file = tmpFile; tmpFile = tmp; }
                tmpFile.delete();
            } else {
                throw new Exception("Failed to save the image as a JPEG");
            }
        } finally {
            out.close();
        }
    } catch (Throwable t) {
        tmpFile.delete();
        throw t;
    }
} finally {
    in.close();
}
于 2011-01-02T20:31:56.050 回答
2

@Phyrum Tea 很好,只是不要忘记关闭所有内容

InputStream in = new FileInputStream(context.getFilesDir() + "image.jpg");
Bitmap bm2 = BitmapFactory.decodeStream(in);
OutputStream stream = new FileOutputStream(String.valueOf(
        context.getFilesDir() + pathImage + "/" + idPicture + ".jpg"));
bm2.compress(Bitmap.CompressFormat.JPEG, 50, stream);
stream.close();
in.close();
于 2016-07-18T20:57:55.617 回答
1

使用 Kotlin 将文件保存pathtmpPath

Files.newInputStream(path).use { inputStream ->
    Files.newOutputStream(tmpPath).use { tmpOutputStream ->
        BitmapFactory
            .decodeStream(inputStream)
            .compress(Bitmap.CompressFormat.JPEG, 30, tmpOutputStream)
    }
}

编辑:确保检查解码失败(并返回 null)的可能性以及压缩实际工作的可能性(布尔返回类型)。

    val success: Boolean = Files.newInputStream(path).use { inputStream ->
        Files.newOutputStream(tmpPath).use { tmpOutputStream ->
            BitmapFactory
                .decodeStream(inputStream)
                ?.compress(Bitmap.CompressFormat.JPEG, config.qualityLevel, tmpOutputStream)
                ?: throw Exception("Failed to decode image")
        }
    }

    if (!success) {
        throw Exception("Failed to compress and save image")
    }
于 2019-02-08T09:48:11.773 回答