Android Image工具类

public class ImageUtils {

private int picType;//0表示默认png图片;1表示jpg或者jpeg

    public static ImageUtilsgetIntance(){

return new ImageUtils();

    }

public void setPicType(int picType) {

this.picType = picType;

    }

/**

* 质量压缩

*/

    public BitmapcompressImage(Bitmap image) {

ByteArrayOutputStream baos =new ByteArrayOutputStream();

        Bitmap.CompressFormat Type=picType==0?Bitmap.CompressFormat.PNG:Bitmap.CompressFormat.JPEG;

        //image.compress(Bitmap.CompressFormat.JPEG, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中

        image.compress(Type, 100, baos);//质量压缩方法,这里100表示不压缩,把压缩后的数据存放到baos中

        int options =100;

        while (baos.toByteArray().length /1024 >100) {//循环判断如果压缩后图片是否大于100kb,大于继续压缩

            baos.reset();//重置baos即清空baos

            image.compress(Bitmap.CompressFormat.JPEG, options, baos);//这里压缩options%,把压缩后的数据存放到baos中

            options -=10;//每次都减少10

        }

ByteArrayInputStream isBm =new ByteArrayInputStream(baos.toByteArray());//把压缩后的数据baos存放到ByteArrayInputStream中

        Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, null);//把ByteArrayInputStream数据生成图片

        return bitmap;

    }

/**

* 图片按比例大小压缩方法(根据路径获取图片并压缩)

*/

    public Bitmapgetimage(String srcPath) {

BitmapFactory.Options newOpts =new BitmapFactory.Options();

        //开始读入图片,此时把options.inJustDecodeBounds 设回true了

        newOpts.inJustDecodeBounds =true;

        Bitmap bitmap = BitmapFactory.decodeFile(srcPath, newOpts);//此时返回bm为空

        newOpts.inJustDecodeBounds =false;

        int w = newOpts.outWidth;

        int h = newOpts.outHeight;

        //现在主流手机比较多是800*480分辨率,所以高和宽我们设置为

        float hh =800f;//这里设置高度为800f

        float ww =480f;//这里设置宽度为480f

//缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可

        int be =1;//be=1表示不缩放

        if (w > h && w > ww) {//如果宽度大的话根据宽度固定大小缩放

            be = (int) (newOpts.outWidth / ww);

        }else if (w < h && h > hh) {//如果高度高的话根据宽度固定大小缩放

            be = (int) (newOpts.outHeight / hh);

        }

if (be <=0)

be =1;

        newOpts.inSampleSize = be;//设置缩放比例

//重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了

        bitmap = BitmapFactory.decodeFile(srcPath, newOpts);

        return compressImage(bitmap);//压缩好比例大小后再进行质量压缩

    }

/**

* 图片按比例大小压缩方法(根据Bitmap图片压缩)

*/

    public Bitmapcomp(Bitmap image) {

ByteArrayOutputStream baos =new ByteArrayOutputStream();

        image.compress(Bitmap.CompressFormat.JPEG, 100, baos);

        if (baos.toByteArray().length /1024 >1024) {//判断如果图片大于1M,进行压缩避免在生成图片(BitmapFactory.decodeStream)时溢出

            baos.reset();//重置baos即清空baos

            Bitmap.CompressFormat Type=picType==0?Bitmap.CompressFormat.PNG:Bitmap.CompressFormat.JPEG;

            //image.compress(Bitmap.CompressFormat.JPEG, 50, baos);//这里压缩50%,把压缩后的数据存放到baos中

            image.compress(Type, 50, baos);//这里压缩50%,把压缩后的数据存放到baos中

        }

ByteArrayInputStream isBm =new ByteArrayInputStream(baos.toByteArray());

        BitmapFactory.Options newOpts =new BitmapFactory.Options();

        //开始读入图片,此时把options.inJustDecodeBounds 设回true了

        newOpts.inJustDecodeBounds =true;

        Bitmap bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);

        newOpts.inJustDecodeBounds =false;

        int w = newOpts.outWidth;

        int h = newOpts.outHeight;

        //现在主流手机比较多是800*480分辨率,所以高和宽我们设置为

        float hh =800f;//这里设置高度为800f

        float ww =480f;//这里设置宽度为480f

//缩放比。由于是固定比例缩放,只用高或者宽其中一个数据进行计算即可

        int be =1;//be=1表示不缩放

        if (w > h && w > ww) {//如果宽度大的话根据宽度固定大小缩放

            be = (int) (newOpts.outWidth / ww);

        }else if (w < h && h > hh) {//如果高度高的话根据宽度固定大小缩放

            be = (int) (newOpts.outHeight / hh);

        }

if (be <=0)

be =1;

        newOpts.inSampleSize = be;//设置缩放比例

//重新读入图片,注意此时已经把options.inJustDecodeBounds 设回false了

        isBm =new ByteArrayInputStream(baos.toByteArray());

        bitmap = BitmapFactory.decodeStream(isBm, null, newOpts);

        return compressImage(bitmap);//压缩好比例大小后再进行质量压缩

    }

/**判断图片类型*/

    public void getPicTypeByUrl(String url){

if(url==null){

return;

        }

if(url.equals("")){

return;

        }

String[] picArray=url.split("/");

        String picStr="";

        if(picArray.length>0){

picStr=picArray[picArray.length-1];

        }else{

picStr=picArray[0];

        }

if(picStr.toLowerCase().contains(".png")){

picType=0;

        }else if(picStr.toLowerCase().contains(".jpg")||picStr.toLowerCase().contains(".jpeg")){

picType=1;

        }

}

/**通过图片url生成Bitmap对象

    * @param urlpath

    * @return Bitmap

* 根据图片url获取图片对象

*/

    public static BitmapgetBitMBitmap(String urlpath) {

Bitmap map =null;

        try {

URL url =new URL(urlpath);

            URLConnection conn = url.openConnection();

            conn.connect();

            InputStream in;

            in = conn.getInputStream();

            map = BitmapFactory.decodeStream(in);

        }catch (IOException e) {

e.printStackTrace();

        }

return map;

    }

/**通过图片url生成Drawable对象

    * @param urlpath

    * @return Bitmap

* 根据url获取布局背景的对象

*/

    public static DrawablegetDrawable(String urlpath){

Drawable drawable =null;

        try {

URL url =new URL(urlpath);

            URLConnection conn = url.openConnection();

            conn.connect();

            InputStream in;

            in = conn.getInputStream();

            drawable = Drawable.createFromStream(in, "background.jpg");

        }catch (IOException e) {

e.printStackTrace();

        }

return drawable;

    }

/**

    * @param 将图片内容解析成字节数组

    * @param inStream

    * @return byte[]

    * @throws Exception

*/

    public static byte[]readStream(InputStream inStream)throws Exception {

byte[] buffer =new byte[1024];

        int len = -1;

        ByteArrayOutputStream outStream =new ByteArrayOutputStream();

        while ((len = inStream.read(buffer)) != -1) {

outStream.write(buffer, 0, len);

        }

byte[] data = outStream.toByteArray();

        outStream.close();

        inStream.close();

        return data;

    }

/**

    * @param 将字节数组转换为ImageView可调用的Bitmap对象

    * @param bytes

    * @param opts

    * @return Bitmap

*/

    public static BitmapgetPicFromBytes(byte[] bytes,

                                        BitmapFactory.Options opts) {

if (bytes !=null)

if (opts !=null)

return BitmapFactory.decodeByteArray(bytes, 0, bytes.length,

                        opts);

else

                return BitmapFactory.decodeByteArray(bytes, 0, bytes.length);

return null;

    }

/**

    * @param 图片缩放

    * @param bitmap 对象

    * @param w 要缩放的宽度

    * @param h 要缩放的高度

    * @return newBmp 新 Bitmap对象

*/

    public static BitmapzoomBitmap(Bitmap bitmap, int w, int h){

int width = bitmap.getWidth();

        int height = bitmap.getHeight();

        Matrix matrix =new Matrix();

        float scaleWidth = ((float) w / width);

        float scaleHeight = ((float) h / height);

        matrix.postScale(scaleWidth, scaleHeight);

        Bitmap newBmp = Bitmap.createBitmap(bitmap, 0, 0, width, height,

                matrix, true);

        return newBmp;

    }

/**

* 把Bitmap转Byte

    * @Author HEH

    * @EditTime 2010-07-19 上午11:45:56

*/

    public static byte[]Bitmap2Bytes(Bitmap bm){

ByteArrayOutputStream baos =new ByteArrayOutputStream();

        bm.compress(Bitmap.CompressFormat.PNG, 100, baos);

        return baos.toByteArray();

    }

/**

* 把字节数组保存为一个文件

    * @Author HEH

    * @EditTime 2010-07-19 上午11:45:56

*/

    public static FilegetFileFromBytes(byte[] b, String outputFile) {

BufferedOutputStream stream =null;

        File file =null;

        try {

file =new File(outputFile);

            FileOutputStream fstream =new FileOutputStream(file);

            stream =new BufferedOutputStream(fstream);

            stream.write(b);

        }catch (Exception e) {

e.printStackTrace();

        }finally {

if (stream !=null) {

try {

stream.close();

                }catch (IOException e1) {

e1.printStackTrace();

                }

}

}

return file;

    }

}

你可能感兴趣的:(Android Image工具类)