通过本地的图片URL,获取压缩的图片文件,提高上传速度:

import android.graphics.Bitmap;import android.graphics.BitmapFactory;import android.graphics.Matrix;import android.media.ExifInterface;import java.io.*;/** * Created by Jiaxuon 2016/3/22. */public class ImageFactory {    private ImageFactory() {    }    private static ImageFactory mInstance = null;    public static ImageFactory getInstance() {        if (mInstance == null) {            mInstance = new ImageFactory();        }        return mInstance;    }    /**     * 通过文件本地URL,获取压缩后的图片     *     * @param path     * @param fileName     * @param width     * @param height     * @return     */    public File getZoomImageFile(String path, String fileName, int width, int height) {        byte[] bytes = compressImage(getZoomBitmap(path, width, height));        File file = getImageFileFromBytes(bytes, fileName);        return file;    }    /**     * 通过文件本地URL,获取压缩后的图片 ,默认图片宽高是720*1280     *     * @param fileName     * @param path     * @return     */    public File getZoomImageFile(String path, String fileName) {        byte[] bytes = compressImage(getZoomBitmap(path, 720, 1280));        File file = getImageFileFromBytes(bytes, fileName);        return file;    }    /**     * 根据byte数组,生成文件     */    public File getImageFileFromBytes(byte[] bfile, String fileName) {        BufferedOutputStream bos = null;        FileOutputStream fos = null;        File tempFile = null;        try {            tempFile = File.createTempFile(fileName, ".jpg");            fos = new FileOutputStream(tempFile);            bos = new BufferedOutputStream(fos);            bos.write(bfile);        } catch (Exception e) {            e.printStackTrace();        } finally {            if (bos != null) {                try {                    bos.close();                } catch (IOException e1) {                    e1.printStackTrace();                }            }            if (fos != null) {                try {                    fos.close();                } catch (IOException e1) {                    e1.printStackTrace();                }            }            tempFile.deleteOnExit();        }        return tempFile;    }    /**     * 将给定的bitmap文件压缩到指定大小     *     * @param image     * @return     */    private byte[] compressImage(Bitmap image) {        if (image == null) return null;        ByteArrayOutputStream baos = new ByteArrayOutputStream();        image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中        int options = 100;        while (baos.toByteArray().length / 1024 > 100) {  //循环判断如果压缩后图片是否大于100kb,大于继续压缩            options -= 10;//每次都减少10            baos.reset();//重置baos即清空baos            image.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中        }        return baos.toByteArray();    }    /**     * 得到缩放的bitmap     */    public Bitmap getZoomBitmap(String path, int width, int height) {        Bitmap bitmap = null;        int sampleSize = 1;        BitmapFactory.Options options = new BitmapFactory.Options();        options.inJustDecodeBounds = true;// 不加载bitmap到内存中        BitmapFactory.decodeFile(path, options);        sampleSize = calculateInSampleSize(options, width, height);        options.inPurgeable = true;        options.inInputShareable = true;        options.inSampleSize = sampleSize;        options.inJustDecodeBounds = false;        bitmap = BitmapFactory.decodeFile(path, options);        bitmap = rotaingImageView(readPictureDegree(path), bitmap);        return bitmap;    }    /**     * 得到options.inSampleSize的值     *     * @param options     * @param reqWidth     * @param reqHeight     * @return     */    private int calculateInSampleSize(BitmapFactory.Options options,                                      int reqWidth, int reqHeight) {        // Raw height and width of image        final int height = options.outHeight;        final int width = options.outWidth;        int inSampleSize = 1;        if (height > reqHeight || width > reqWidth) {            final int halfHeight = height / 2;            final int halfWidth = width / 2;            // Calculate the largest inSampleSize value that is a power of 2 and            // keeps both            // height and width larger than the requested height and width.            while ((halfHeight / inSampleSize) > reqHeight                    && (halfWidth / inSampleSize) > reqWidth) {                inSampleSize *= 2;            }        }        return inSampleSize;    }    /**     * 读取图片属性:旋转的角度     *     * @param path 图片绝对路径     * @return degree旋转的角度     */    private int readPictureDegree(String path) {        int degree = 0;        try {            ExifInterface exifInterface = new ExifInterface(path);            int orientation = exifInterface.getAttributeInt(                    ExifInterface.TAG_ORIENTATION,                    ExifInterface.ORIENTATION_NORMAL);            switch (orientation) {                case ExifInterface.ORIENTATION_ROTATE_90:                    degree = 90;                    break;                case ExifInterface.ORIENTATION_ROTATE_180:                    degree = 180;                    break;                case ExifInterface.ORIENTATION_ROTATE_270:                    degree = 270;                    break;            }        } catch (IOException e) {            e.printStackTrace();        }        return degree;    }    /*     * 旋转图片     *     * @param angle     *     * @param bitmap     *     * @return Bitmap     */    private Bitmap rotaingImageView(int angle, Bitmap bitmap) {        if (bitmap == null)            return null;        // 旋转图片 动作        Matrix matrix = new Matrix();        matrix.postRotate(angle);        // matrix.setRotate(0);        // 创建新的图片        Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0,                bitmap.getWidth(), bitmap.getHeight(), matrix, true);        return resizedBitmap;    }}


更多相关文章

  1. android 网络请求图片
  2. android上传文件至服务器
  3. android Animation图片渐变动画 Demo
  4. 使用android的bitmap类实现图片的拼接
  5. android下图片压缩
  6. android 图片展示
  7. Android播放GIF图片
  8. Android写文件到Sd卡的一般过程

随机推荐

  1. Android自学 --点击事件以及弹出菜单
  2. Android(安卓)NDK开发技巧二
  3. Android下拉刷新完全解析,教你如何一分钟
  4. Android实现给TableLayou绘制边框的方法
  5. android 之进度条--------progressbar
  6. android:listview实现qq,微信好友列表(头像
  7. Android的Message Queue
  8. Android UI之ImageButton(带图标的按钮)
  9. Android(安卓)APK加固后如何签名
  10. Android 效率开发之图片保存到图库