How to save a JPEG image on Android with a custom quality level

后端 未结 4 1037
滥情空心
滥情空心 2020-12-01 11:47

On Android, how do I save an image file as a JPEG at 30% quality?

In standard Java, I would use ImageIO to read the image as a BufferedImage

相关标签:
4条回答
  • 2020-12-01 11:54
    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();
    }
    
    0 讨论(0)
  • 2020-12-01 12:02

    You can store your bitmap in the JPEG format by calling compress and setting the second parameter:

    
        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);
    

    0 讨论(0)
  • 2020-12-01 12:08

    @Phyrum Tea is good only do not forget close everything

    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();
    
    0 讨论(0)
  • 2020-12-01 12:11

    Using Kotlin to save a file in path to tmpPath:

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

    Edit: make sure you check for the possibility of the decode failing (and returning null) and also that compress actually worked (boolean return type).

        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")
        }
    
    0 讨论(0)
提交回复
热议问题