Android 缩小图像大小

Android 缩小图像大小,android,android-intent,Android,Android Intent,我试图缩小用户从图库中选择的图像的大小,然后再将其传递给其他用户 我目前正在使用以下代码,但似乎不起作用: private Bitmap decodeFile(File f) throws IOException { Bitmap b = null; //Decode image size BitmapFactory.Options o = new BitmapFactory.Options(); o.inJustDecodeBounds = true;

我试图缩小用户从图库中选择的图像的大小,然后再将其传递给其他用户

我目前正在使用以下代码,但似乎不起作用:

private Bitmap decodeFile(File f) throws IOException {
    Bitmap b = null;

    //Decode image size
    BitmapFactory.Options o = new BitmapFactory.Options();
    o.inJustDecodeBounds = true;

    FileInputStream fis = null;
    fis = new FileInputStream(f);

    BitmapFactory.decodeStream(fis, null, o);
    fis.close();

    int scale = 1;
    if (o.outHeight > IMAGE_MAX_SIZE || o.outWidth > IMAGE_MAX_SIZE) {
        scale = (int)Math.pow(2, (int) Math.ceil(Math.log(IMAGE_MAX_SIZE / 
           (double) Math.max(o.outHeight, o.outWidth)) / Math.log(0.5)));
    }

    //Decode with inSampleSize
    BitmapFactory.Options o2 = new BitmapFactory.Options();
    o2.inSampleSize = scale;
    fis = new FileInputStream(f);
    b = BitmapFactory.decodeStream(fis, null, o2);
    fis.close();

    return b;
}

最好的方法是将图像路径通过intent,然后从那里降级图像。您不需要在当前活动中降级映像并传递降级映像

按照这里,以降低您的形象。那里
inSampleSize会降低图像质量。inSampleSize越高,图像大小越小。

要压缩图像,可以使用下面的代码

import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.media.ExifInterface;

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class ImageResizer {

    public static String getCompressImageFile(File original, int width, int height, String filePath) {
        Bitmap sampledSrcBitmap = decodeFile(original, width, height);

        if(sampledSrcBitmap == null) {
            return null;
        }
        Bitmap bitmap = getRotatedImage(sampledSrcBitmap,original.getPath());

        int bitmap_width = bitmap.getWidth();
        int bitmap_height = bitmap.getHeight();

        boolean success;
        if(bitmap_width<width && bitmap_height <height){
            success = writeToFile(bitmap, new File(filePath),100);
        }else{
            bitmap = resize(bitmap, width, height);
            success = writeToFile(bitmap, new File(filePath),80);
        }
        bitmap.recycle();
        if(success){
            return filePath;
        }else{
            return null;
        }
    }

    private static Bitmap getRotatedImage(Bitmap sampledSrcBitmap,String path){
        ExifInterface exif;
        Matrix matrix = new Matrix();
        Bitmap bitmap=null;
        try {
            exif = new ExifInterface(path);
            int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 0);
            if (orientation == 6) {
                matrix.postRotate(90);
            } else if (orientation == 3) {
                matrix.postRotate(180);
            } else if (orientation == 8) {
                matrix.postRotate(270);
            }
            bitmap  = Bitmap.createBitmap(sampledSrcBitmap, 0, 0, sampledSrcBitmap.getWidth(), sampledSrcBitmap.getHeight(), matrix, true);
        } catch (IOException e) {
            e.printStackTrace();
        }
        return bitmap;
    }

    public static Bitmap resize(Bitmap sampledSrcBitmap, int width, int height) {
        int sourceWidth = sampledSrcBitmap.getWidth();
        int sourceHeight = sampledSrcBitmap.getHeight();
        height = calculateHeight(sourceWidth, sourceHeight, width);
        return Bitmap.createScaledBitmap(sampledSrcBitmap, width, height, true);
    }

    private static int calculateWidth(int originalWidth, int originalHeight, int height) {
        return (int) Math.ceil(originalWidth / ((double) originalHeight/height));
    }

    private static int calculateHeight(int originalWidth, int originalHeight, int width) {
        return (int) Math.ceil(originalHeight / ((double) originalWidth/width));
    }

    public static Bitmap decodeFile(File bitmapFile, int reqWidth, int reqHeight){
        BitmapFactory.Options options = new BitmapFactory.Options();
        options.inJustDecodeBounds = true;
        BitmapFactory.decodeFile(bitmapFile.getAbsolutePath(), options);

        options.inSampleSize = calculateInSampleSize(options, reqWidth, reqHeight);
        options.inJustDecodeBounds = false;
        options.inDither = false;
        options.inPurgeable = true;
        options.inInputShareable = true;
        options.inPreferQualityOverSpeed = true;

        return BitmapFactory.decodeFile(bitmapFile.getAbsolutePath(), options);
    }

    public static int calculateInSampleSize(BitmapFactory.Options options, int reqWidth, int reqHeight) {
        if(reqWidth == -1) {
            reqWidth = options.outWidth;
        }

        if(reqHeight == -1) {
            reqHeight = options.outHeight;
        }

        // Raw height and width of image
        final int height = options.outHeight;
        final int width = options.outWidth;
        int inSampleSize = 1;

        if (height > reqHeight || width > reqWidth) {
            if (width > height) {
                inSampleSize = Math.round((float) height / (float) reqHeight);
            } else {
                inSampleSize = Math.round((float) width / (float) reqWidth);
            }
        }

        return inSampleSize;
    }

    public static boolean writeToFile(Bitmap image, File file, int quality) {
        ByteArrayOutputStream bytes = new ByteArrayOutputStream();
        image.compress(CompressFormat.JPEG, quality, bytes);

        try {

            FileOutputStream fos = new FileOutputStream(file);
            fos.write(bytes.toByteArray());
            fos.close();

        } catch (FileNotFoundException e) {
            e.printStackTrace();
            return false;
        } catch (IOException e) {
            e.printStackTrace();
            return false;
        }

        return true;
    }

}

您可以使用此代码

public static Bitmap getThumbnailBitmap(final String path,
        final int thumbnailSize) {
    Bitmap bitmap;
    BitmapFactory.Options bounds = new BitmapFactory.Options();
    bounds.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(path, bounds);
    if ((bounds.outWidth == -1) || (bounds.outHeight == -1)) {
        bitmap = null;
    }
    int originalSize = (bounds.outHeight > bounds.outWidth) ? bounds.outHeight
            : bounds.outWidth;
    BitmapFactory.Options opts = new BitmapFactory.Options();
    if (thumbnailSize > 0) {
        opts.inSampleSize = originalSize / thumbnailSize;
    } else {
        opts.inSampleSize = originalSize;
    }
    try {
        bitmap = BitmapFactory.decodeFile(path, opts);

    } catch (Exception ex) {
        return null;
    }
    return bitmap;
}

我已经重新编写了问题和标题,以更好地适合该网站,希望能让更多的意见和回答你的问题
public static Bitmap getThumbnailBitmap(final String path,
        final int thumbnailSize) {
    Bitmap bitmap;
    BitmapFactory.Options bounds = new BitmapFactory.Options();
    bounds.inJustDecodeBounds = true;
    BitmapFactory.decodeFile(path, bounds);
    if ((bounds.outWidth == -1) || (bounds.outHeight == -1)) {
        bitmap = null;
    }
    int originalSize = (bounds.outHeight > bounds.outWidth) ? bounds.outHeight
            : bounds.outWidth;
    BitmapFactory.Options opts = new BitmapFactory.Options();
    if (thumbnailSize > 0) {
        opts.inSampleSize = originalSize / thumbnailSize;
    } else {
        opts.inSampleSize = originalSize;
    }
    try {
        bitmap = BitmapFactory.decodeFile(path, opts);

    } catch (Exception ex) {
        return null;
    }
    return bitmap;
}