zoukankan      html  css  js  c++  java
  • 常用的图片相关方法,读取,保存,压缩,缩放,旋转,drawable转化

    import android.content.Context;
    import android.content.res.AssetManager;
    import android.content.res.Resources;
    import android.graphics.Bitmap;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.graphics.Matrix;
    import android.graphics.PixelFormat;
    import android.graphics.drawable.BitmapDrawable;
    import android.graphics.drawable.Drawable;
    import android.media.ExifInterface;
    import android.text.TextUtils;
    
    import java.io.BufferedOutputStream;
    import java.io.ByteArrayInputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    
    /**
     * Created by xiaoxin on 2016/12/23.
     */
    
    public class ImageUtils {
    
        /**
         * 获取缩放后的本地图片   从文件读取方式二 效率高于方式一
         *
         * @param filePath 文件路径
         * @param width    宽
         * @param height   高
         * @return
         */
        public static Bitmap readBitmapFromFileDescriptor(String filePath, int width, int height) {
            try {
                FileInputStream fis = new FileInputStream(filePath);
                BitmapFactory.Options options = new BitmapFactory.Options();
                options.inJustDecodeBounds = true;
                BitmapFactory.decodeFileDescriptor(fis.getFD(), null, options);
                float srcWidth = options.outWidth;
                float srcHeight = options.outHeight;
                int inSampleSize = 1;
    
                if (srcHeight > height || srcWidth > width) {
                    if (srcWidth > srcHeight) {
                        inSampleSize = Math.round(srcHeight / height);
                    } else {
                        inSampleSize = Math.round(srcWidth / width);
                    }
                }
    
                options.inJustDecodeBounds = false;
                options.inSampleSize = inSampleSize;
    
                return BitmapFactory.decodeFileDescriptor(fis.getFD(), null, options);
            } catch (Exception ex) {
            }
            return null;
        }
    
        /**
         * 从输入流中读取文件获取缩放后的本地图片
       
         * @param ins    输入流
         * @param width  宽
         * @param height 高
         * @return
         */
        public static Bitmap readBitmapFromInputStream(InputStream ins, int width, int height) {
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inJustDecodeBounds = true;
            BitmapFactory.decodeStream(ins, null, options);
            float srcWidth = options.outWidth;
            float srcHeight = options.outHeight;
            int inSampleSize = 1;
    
            if (srcHeight > height || srcWidth > width) {
                if (srcWidth > srcHeight) {
                    inSampleSize = Math.round(srcHeight / height);
                } else {
                    inSampleSize = Math.round(srcWidth / width);
                }
            }
    
            options.inJustDecodeBounds = false;
            options.inSampleSize = inSampleSize;
    
            return BitmapFactory.decodeStream(ins, null, options);
        }
    
        /**
         * 从资源文件中读取文件
         *
         * @param resources
         * @param resourcesId
         * @param width
         * @param height
         * @return
         */
    
        public static Bitmap readBitmapFromResource(Resources resources, int resourcesId, int width, int height) {
            InputStream ins = resources.openRawResource(resourcesId);
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inJustDecodeBounds = true;
            BitmapFactory.decodeStream(ins, null, options);
            float srcWidth = options.outWidth;
            float srcHeight = options.outHeight;
            int inSampleSize = 1;
    
            if (srcHeight > height || srcWidth > width) {
                if (srcWidth > srcHeight) {
                    inSampleSize = Math.round(srcHeight / height);
                } else {
                    inSampleSize = Math.round(srcWidth / width);
                }
            }
    
            options.inJustDecodeBounds = false;
            options.inSampleSize = inSampleSize;
    
            return BitmapFactory.decodeStream(ins, null, options);
        }
    
        /**
         * 从二进制数据读取图片
         *
         * @param data
         * @param width
         * @param height
         * @return
         */
        public static Bitmap readBitmapFromByteArray(byte[] data, int width, int height) {
            BitmapFactory.Options options = new BitmapFactory.Options();
            options.inJustDecodeBounds = true;
            BitmapFactory.decodeByteArray(data, 0, data.length, options);
            float srcWidth = options.outWidth;
            float srcHeight = options.outHeight;
            int inSampleSize = 1;
    
            if (srcHeight > height || srcWidth > width) {
                if (srcWidth > srcHeight) {
                    inSampleSize = Math.round(srcHeight / height);
                } else {
                    inSampleSize = Math.round(srcWidth / width);
                }
            }
    
            options.inJustDecodeBounds = false;
            options.inSampleSize = inSampleSize;
    
            return BitmapFactory.decodeByteArray(data, 0, data.length, options);
        }
    
        /**
         * 从assets文件读取图片
         *
         * @param filePath 文件路径
         * @return
         */
        public static Bitmap readBitmapFromAssetsFile(Context context, String filePath) {
            Bitmap image = null;
            AssetManager am = context.getResources().getAssets();
            try {
                InputStream is = am.open(filePath);
                image = BitmapFactory.decodeStream(is);
                is.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            return image;
        }
    
        /**
         * 图片保存文件:
         *
         * @param filePath
         * @param b
         * @param quality
         */
        public static void writeBitmapToFile(String filePath, Bitmap b, int quality) {
            try {
                File desFile = new File(filePath);
                FileOutputStream fos = new FileOutputStream(desFile);
                BufferedOutputStream bos = new BufferedOutputStream(fos);
                b.compress(Bitmap.CompressFormat.JPEG, quality, bos);
                bos.flush();
                bos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
        /**
         * 图片压缩:
         *
         * @param image
         * @return
         */
        private static Bitmap compressImage(Bitmap image) {
            if (image == null) {
                return null;
            }
            ByteArrayOutputStream baos = null;
            try {
                baos = new ByteArrayOutputStream();
                image.compress(Bitmap.CompressFormat.JPEG, 100, baos);
                byte[] bytes = baos.toByteArray();
                ByteArrayInputStream isBm = new ByteArrayInputStream(bytes);
                Bitmap bitmap = BitmapFactory.decodeStream(isBm);
                return bitmap;
            } catch (OutOfMemoryError e) {
            } finally {
                try {
                    if (baos != null) {
                        baos.close();
                    }
                } catch (IOException e) {
                }
            }
            return null;
        }
    
        /**
         * 根据scale生成一张图片  图片缩放:
         *
         * @param bitmap
         * @param scale  等比缩放值
         * @return
         */
        public static Bitmap bitmapScale(Bitmap bitmap, float scale) {
            Matrix matrix = new Matrix();
            matrix.postScale(scale, scale); // 长和宽放大缩小的比例
            Bitmap resizeBmp = Bitmap.createBitmap(bitmap, 0, 0, bitmap.getWidth(), bitmap.getHeight(), matrix, true);
            return resizeBmp;
        }
    
        /**
         * 获取图片旋转角度:
         * 读取照片exif信息中的旋转角度
         *
         * @param path 照片路径
         * @return角度
         */
        private static int readPictureDegree(String path) {
            if (TextUtils.isEmpty(path)) {
                return 0;
            }
            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 (Exception e) {
            }
            return degree;
        }
    
        /**
         * 图片旋转角度:
         *
         * @param b
         * @param rotateDegree
         * @return
         */
        private static Bitmap rotateBitmap(Bitmap b, float rotateDegree) {
            if (b == null) {
                return null;
            }
            Matrix matrix = new Matrix();
            matrix.postRotate(rotateDegree);
            Bitmap rotaBitmap = Bitmap.createBitmap(b, 0, 0, b.getWidth(), b.getHeight(), matrix, true);
            return rotaBitmap;
        }
    
        /**
         * 图片转二进制:
         *
         * @param bm
         * @return
         */
        public byte[] bitmap2Bytes(Bitmap bm) {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
            return baos.toByteArray();
        }
    
        /**
         * Bitmap转Drawable
         *
         * @param resources
         * @param bm
         * @return
         */
        public static Drawable bitmapToDrawable(Resources resources, Bitmap bm) {
            Drawable drawable = new BitmapDrawable(resources, bm);
            return drawable;
        }
    
        /**
         * Drawable转Bitmap
         *
         * @param drawable
         * @return
         */
        public static Bitmap drawableToBitmap(Drawable drawable) {
            Bitmap bitmap = Bitmap.createBitmap(drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565);
            Canvas canvas = new Canvas(bitmap);
            drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight());
            drawable.draw(canvas);
            return bitmap;
        }
    }
  • 相关阅读:
    《那些年啊,那些事——一个程序员的奋斗史》——94
    《那些年啊,那些事——一个程序员的奋斗史》——95
    《玩转.NET Micro Framework 移植基于STM32F10x处理器》前言
    《玩转.NET Micro Framework 移植基于STM32F10x处理器》资源汇总
    《那些年啊,那些事——一个程序员的奋斗史》——96
    《玩转.NET Micro Framework 移植基于STM32F10x处理器》微软中国.NET Micro Framework项目组工程师所作之序
    《那些年啊,那些事——一个程序员的奋斗史》——91
    《那些年啊,那些事——一个程序员的奋斗史》——93
    分享多年美工工作收集的小工具和经验
    C# 3.0的一些新特性
  • 原文地址:https://www.cnblogs.com/zhou2016/p/6281678.html
Copyright © 2011-2022 走看看