猿问

如何在上传到服务器之前减小图像文件大小

许多应用程序允许共享从图库中挑选的图像。


他们上传原始图片文件吗?这是1-3 MB?或者他们处理?


在任何情况下,我如何从文件路径中获取图像,通过降低分辨率来减小其大小,并将其保存在其他地方并尝试上传?


我试过了:


Bitmap photo = decodeSampledBitmapFromFile(filePath, DESIRED_WIDTH,

                    DESIRED_HEIGHT);


FileOutputStream out = new FileOutputStream(filePath);

photo.compress(Bitmap.CompressFormat.JPEG, 100, out);


public static Bitmap decodeSampledBitmapFromFile(String path, int reqWidth,

        int reqHeight) {


    final BitmapFactory.Options options = new BitmapFactory.Options();

    options.inJustDecodeBounds = true;

    BitmapFactory.decodeFile(path, options);


    final int height = options.outHeight;

    final int width = options.outWidth;

    options.inPreferredConfig = Bitmap.Config.ARGB_8888;

    int inSampleSize = 1;


    if (height > reqHeight) {

        inSampleSize = Math.round((float) height / (float) reqHeight);

    }

    int expectedWidth = width / inSampleSize;


    if (expectedWidth > reqWidth) {

        inSampleSize = Math.round((float) width / (float) reqWidth);

    }

    options.inSampleSize = inSampleSize;

    options.inJustDecodeBounds = false;

    return BitmapFactory.decodeFile(path, options);

}

但这是他们正确的方法吗?因为我在这里看到了答案compression operation takes rather big amount of time


梵蒂冈之花
浏览 488回答 3
3回答

凤凰求蛊

我使用此功能在上传之前减小图像的大小,它将图像大小减小到接近200 KB并保持质量相对较好,您可以通过更改REQUIRED_SIZE和inSampleSize来修改它以实现您的目的:public File saveBitmapToFile(File file){    try {        // BitmapFactory options to downsize the image        BitmapFactory.Options o = new BitmapFactory.Options();        o.inJustDecodeBounds = true;        o.inSampleSize = 6;        // factor of downsizing the image        FileInputStream inputStream = new FileInputStream(file);        //Bitmap selectedBitmap = null;        BitmapFactory.decodeStream(inputStream, null, o);        inputStream.close();        // The new size we want to scale to        final int REQUIRED_SIZE=75;        // Find the correct scale value. It should be the power of 2.        int scale = 1;        while(o.outWidth / scale / 2 >= REQUIRED_SIZE &&                        o.outHeight / scale / 2 >= REQUIRED_SIZE) {            scale *= 2;        }        BitmapFactory.Options o2 = new BitmapFactory.Options();        o2.inSampleSize = scale;        inputStream = new FileInputStream(file);        Bitmap selectedBitmap = BitmapFactory.decodeStream(inputStream, null, o2);        inputStream.close();        // here i override the original image file        file.createNewFile();        FileOutputStream outputStream = new FileOutputStream(file);        selectedBitmap.compress(Bitmap.CompressFormat.JPEG, 100 , outputStream);        return file;    } catch (Exception e) {        return null;    }}注意:我在此函数中调整大小并覆盖原始文件图像,您也可以将其写入另一个文件。我希望它可以帮助你。

GCT1015

这是我的解决方案/** This procedure will replace the original image* So you need to do a tmp copy to send before reduce*/public static boolean reduceImage(String path, long maxSize) {    File img = new File(path);    boolean result = false;    BitmapFactory.Options options = new BitmapFactory.Options();    Bitmap bitmap = null;    options.inSampleSize=1;    while (img.length()>maxSize) {        options.inSampleSize = options.inSampleSize+1;        bitmap = BitmapFactory.decodeFile(path, options);        img.delete();        try            {                FileOutputStream fos = new FileOutputStream(path);                img.compress(path.toLowerCase().endsWith("png")?                                Bitmap.CompressFormat.PNG:                                Bitmap.CompressFormat.JPEG, 100, fos);                fos.close();                result = true;             }catch (Exception errVar) {                 errVar.printStackTrace();              }    };    return result;}编辑删除了其他程序调用
随时随地看视频慕课网APP

相关分类

Android
我要回答