• 【ListViewJSON】【com.demo.app.common】【ImageUtils】源码分析及其在工程中作用


    首先源码:

    package com.demo.app.common;
    
    import java.io.BufferedOutputStream;
    import java.io.ByteArrayOutputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.sql.Timestamp;
    import java.text.SimpleDateFormat;
    
    import android.app.Activity;
    import android.content.ContentResolver;
    import android.content.Context;
    import android.content.Intent;
    import android.database.Cursor;
    import android.graphics.Bitmap;
    import android.graphics.Bitmap.CompressFormat;
    import android.graphics.Bitmap.Config;
    import android.graphics.BitmapFactory;
    import android.graphics.Canvas;
    import android.graphics.LinearGradient;
    import android.graphics.Matrix;
    import android.graphics.Paint;
    import android.graphics.PixelFormat;
    import android.graphics.PorterDuff.Mode;
    import android.graphics.PorterDuffXfermode;
    import android.graphics.Rect;
    import android.graphics.RectF;
    import android.graphics.Shader.TileMode;
    import android.graphics.drawable.BitmapDrawable;
    import android.graphics.drawable.Drawable;
    import android.net.Uri;
    import android.os.Environment;
    import android.provider.MediaStore;
    import android.util.DisplayMetrics;
    
    /**
     * 图片操作工具包
     * 
     * @author liux ()
     * @version 1.0
     * @created 2012-3-21
     */
    public class ImageUtils {
    
        public final static String SDCARD_MNT = "/mnt/sdcard";
        public final static String SDCARD = "/sdcard";
    
        /** 请求相册 */
        public static final int REQUEST_CODE_GETIMAGE_BYSDCARD = 0;
        /** 请求相机 */
        public static final int REQUEST_CODE_GETIMAGE_BYCAMERA = 1;
        /** 请求裁剪 */
        public static final int REQUEST_CODE_GETIMAGE_BYCROP = 2;
    
        /**
         * 写图片文件 在Android系统中,文件保存在 /data/data/PACKAGE_NAME/files 目录下
         * 
         * @throws IOException
         */
        public static void saveImage(Context context, String fileName, Bitmap bitmap)
                throws IOException {
            saveImage(context, fileName, bitmap, 100);
        }
    
        public static void saveImage(Context context, String fileName,
                Bitmap bitmap, int quality) throws IOException {
            if (bitmap == null || fileName == null || context == null)
                return;
    
            FileOutputStream fos = context.openFileOutput(fileName,
                    Context.MODE_PRIVATE);
            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            bitmap.compress(CompressFormat.JPEG, quality, stream);
            byte[] bytes = stream.toByteArray();
            fos.write(bytes);
            fos.close();
        }
    
        /**
         * 写图片文件到SD卡
         * 
         * @throws IOException
         */
        public static void saveImageToSD(Context ctx, String filePath,
                Bitmap bitmap, int quality) throws IOException {
            if (bitmap != null) {
                File file = new File(filePath.substring(0,
                        filePath.lastIndexOf(File.separator)));
                if (!file.exists()) {
                    file.mkdirs();
                }
                BufferedOutputStream bos = new BufferedOutputStream(
                        new FileOutputStream(filePath));
                bitmap.compress(CompressFormat.JPEG, quality, bos);
                bos.flush();
                bos.close();
                if(ctx!=null){
                    scanPhoto(ctx, filePath);
                }
            }
        }
    
        /**
         * 让Gallery上能马上看到该图片
         */
        private static void scanPhoto(Context ctx, String imgFileName) {
            Intent mediaScanIntent = new Intent(
                    Intent.ACTION_MEDIA_SCANNER_SCAN_FILE);
            File file = new File(imgFileName);
            Uri contentUri = Uri.fromFile(file);
            mediaScanIntent.setData(contentUri);
            ctx.sendBroadcast(mediaScanIntent);
        }
    
        /**
         * 获取bitmap
         * 
         * @param context
         * @param fileName
         * @return
         */
        public static Bitmap getBitmap(Context context, String fileName) {
            FileInputStream fis = null;
            Bitmap bitmap = null;
            try {
                fis = context.openFileInput(fileName);
                bitmap = BitmapFactory.decodeStream(fis);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (OutOfMemoryError e) {
                e.printStackTrace();
            } finally {
                try {
                    fis.close();
                } catch (Exception e) {
                }
            }
            return bitmap;
        }
    
        /**
         * 获取bitmap
         * 
         * @param filePath
         * @return
         */
        public static Bitmap getBitmapByPath(String filePath) {
            return getBitmapByPath(filePath, null);
        }
    
        public static Bitmap getBitmapByPath(String filePath,
                BitmapFactory.Options opts) {
            FileInputStream fis = null;
            Bitmap bitmap = null;
            try {
                File file = new File(filePath);
                fis = new FileInputStream(file);
                bitmap = BitmapFactory.decodeStream(fis, null, opts);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (OutOfMemoryError e) {
                e.printStackTrace();
            } finally {
                try {
                    fis.close();
                } catch (Exception e) {
                }
            }
            return bitmap;
        }
    
        /**
         * 获取bitmap
         * 
         * @param file
         * @return
         */
        public static Bitmap getBitmapByFile(File file) {
            FileInputStream fis = null;
            Bitmap bitmap = null;
            try {
                fis = new FileInputStream(file);
                bitmap = BitmapFactory.decodeStream(fis);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (OutOfMemoryError e) {
                e.printStackTrace();
            } finally {
                try {
                    fis.close();
                } catch (Exception e) {
                }
            }
            return bitmap;
        }
    
        /**
         * 使用当前时间戳拼接一个唯一的文件名
         * 
         * @param format
         * @return
         */
        public static String getTempFileName() {
            SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd_HH-mm-ss_SS");
            String fileName = format.format(new Timestamp(System
                    .currentTimeMillis()));
            return fileName;
        }
    
        /**
         * 获取照相机使用的目录
         * 
         * @return
         */
        public static String getCamerPath() {
            return Environment.getExternalStorageDirectory() + File.separator
                    + "FounderNews" + File.separator;
        }
    
        /**
         * 判断当前Url是否标准的content://样式,如果不是,则返回绝对路径
         * 
         * @param uri
         * @return
         */
        public static String getAbsolutePathFromNoStandardUri(Uri mUri) {
            String filePath = null;
    
            String mUriString = mUri.toString();
            mUriString = Uri.decode(mUriString);
    
            String pre1 = "file://" + SDCARD + File.separator;
            String pre2 = "file://" + SDCARD_MNT + File.separator;
    
            if (mUriString.startsWith(pre1)) {
                filePath = Environment.getExternalStorageDirectory().getPath()
                        + File.separator + mUriString.substring(pre1.length());
            } else if (mUriString.startsWith(pre2)) {
                filePath = Environment.getExternalStorageDirectory().getPath()
                        + File.separator + mUriString.substring(pre2.length());
            }
            return filePath;
        }
    
        /**
         * 通过uri获取文件的绝对路径
         * 
         * @param uri
         * @return
         */
        public static String getAbsoluteImagePath(Activity context, Uri uri) {
            String imagePath = "";
            String[] proj = { MediaStore.Images.Media.DATA };
            Cursor cursor = context.managedQuery(uri, proj, // Which columns to
                                                            // return
                    null, // WHERE clause; which rows to return (all rows)
                    null, // WHERE clause selection arguments (none)
                    null); // Order-by clause (ascending by name)
    
            if (cursor != null) {
                int column_index = cursor
                        .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                if (cursor.getCount() > 0 && cursor.moveToFirst()) {
                    imagePath = cursor.getString(column_index);
                }
            }
    
            return imagePath;
        }
    
        /**
         * 获取图片缩略图 只有Android2.1以上版本支持
         * 
         * @param imgName
         * @param kind
         *            MediaStore.Images.Thumbnails.MICRO_KIND
         * @return
         */
        public static Bitmap loadImgThumbnail(Activity context, String imgName,
                int kind) {
            Bitmap bitmap = null;
    
            String[] proj = { MediaStore.Images.Media._ID,
                    MediaStore.Images.Media.DISPLAY_NAME };
    
            Cursor cursor = context.managedQuery(
                    MediaStore.Images.Media.EXTERNAL_CONTENT_URI, proj,
                    MediaStore.Images.Media.DISPLAY_NAME + "='" + imgName + "'",
                    null, null);
    
            if (cursor != null && cursor.getCount() > 0 && cursor.moveToFirst()) {
                ContentResolver crThumb = context.getContentResolver();
                BitmapFactory.Options options = new BitmapFactory.Options();
                options.inSampleSize = 1;
                bitmap = MethodsCompat.getThumbnail(crThumb, cursor.getInt(0),
                        kind, options);
            }
            return bitmap;
        }
    
        public static Bitmap loadImgThumbnail(String filePath, int w, int h) {
            Bitmap bitmap = getBitmapByPath(filePath);
            return zoomBitmap(bitmap, w, h);
        }
    
        /**
         * 获取SD卡中最新图片路径
         * 
         * @return
         */
        public static String getLatestImage(Activity context) {
            String latestImage = null;
            String[] items = { MediaStore.Images.Media._ID,
                    MediaStore.Images.Media.DATA };
            Cursor cursor = context.managedQuery(
                    MediaStore.Images.Media.EXTERNAL_CONTENT_URI, items, null,
                    null, MediaStore.Images.Media._ID + " desc");
    
            if (cursor != null && cursor.getCount() > 0) {
                cursor.moveToFirst();
                for (cursor.moveToFirst(); !cursor.isAfterLast(); cursor
                        .moveToNext()) {
                    latestImage = cursor.getString(1);
                    break;
                }
            }
    
            return latestImage;
        }
    
        /**
         * 计算缩放图片的宽高
         * 
         * @param img_size
         * @param square_size
         * @return
         */
        public static int[] scaleImageSize(int[] img_size, int square_size) {
            if (img_size[0] <= square_size && img_size[1] <= square_size)
                return img_size;
            double ratio = square_size
                    / (double) Math.max(img_size[0], img_size[1]);
            return new int[] { (int) (img_size[0] * ratio),
                    (int) (img_size[1] * ratio) };
        }
    
        /**
         * 创建缩略图
         * 
         * @param context
         * @param largeImagePath
         *            原始大图路径
         * @param thumbfilePath
         *            输出缩略图路径
         * @param square_size
         *            输出图片宽度
         * @param quality
         *            输出图片质量
         * @throws IOException
         */
        public static void createImageThumbnail(Context context,
                String largeImagePath, String thumbfilePath, int square_size,
                int quality) throws IOException {
            BitmapFactory.Options opts = new BitmapFactory.Options();
            opts.inSampleSize = 1;
            // 原始图片bitmap
            Bitmap cur_bitmap = getBitmapByPath(largeImagePath, opts);
    
            if (cur_bitmap == null)
                return;
    
            // 原始图片的高宽
            int[] cur_img_size = new int[] { cur_bitmap.getWidth(),
                    cur_bitmap.getHeight() };
            // 计算原始图片缩放后的宽高
            int[] new_img_size = scaleImageSize(cur_img_size, square_size);
            // 生成缩放后的bitmap
            Bitmap thb_bitmap = zoomBitmap(cur_bitmap, new_img_size[0],
                    new_img_size[1]);
            // 生成缩放后的图片文件
            saveImageToSD(null,thumbfilePath, thb_bitmap, quality);
        }
    
        /**
         * 放大缩小图片
         * 
         * @param bitmap
         * @param w
         * @param h
         * @return
         */
        public static Bitmap zoomBitmap(Bitmap bitmap, int w, int h) {
            Bitmap newbmp = null;
            if (bitmap != null) {
                int width = bitmap.getWidth();
                int height = bitmap.getHeight();
                Matrix matrix = new Matrix();
                float scaleWidht = ((float) w / width);
                float scaleHeight = ((float) h / height);
                matrix.postScale(scaleWidht, scaleHeight);
                newbmp = Bitmap.createBitmap(bitmap, 0, 0, width, height, matrix,
                        true);
            }
            return newbmp;
        }
    
        public static Bitmap scaleBitmap(Bitmap bitmap) {
            // 获取这个图片的宽和高
            int width = bitmap.getWidth();
            int height = bitmap.getHeight();
            // 定义预转换成的图片的宽度和高度
            int newWidth = 200;
            int newHeight = 200;
            // 计算缩放率,新尺寸除原始尺寸
            float scaleWidth = ((float) newWidth) / width;
            float scaleHeight = ((float) newHeight) / height;
            // 创建操作图片用的matrix对象
            Matrix matrix = new Matrix();
            // 缩放图片动作
            matrix.postScale(scaleWidth, scaleHeight);
            // 旋转图片 动作
            // matrix.postRotate(45);
            // 创建新的图片
            Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0, width, height,
                    matrix, true);
            return resizedBitmap;
        }
    
        /**
         * (缩放)重绘图片
         * 
         * @param context
         *            Activity
         * @param bitmap
         * @return
         */
        public static Bitmap reDrawBitMap(Activity context, Bitmap bitmap) {
            DisplayMetrics dm = new DisplayMetrics();
            context.getWindowManager().getDefaultDisplay().getMetrics(dm);
            int rHeight = dm.heightPixels;
            int rWidth = dm.widthPixels;
            // float rHeight=dm.heightPixels/dm.density+0.5f;
            // float rWidth=dm.widthPixels/dm.density+0.5f;
            // int height=bitmap.getScaledHeight(dm);
            // int width = bitmap.getScaledWidth(dm);
            int height = bitmap.getHeight();
            int width = bitmap.getWidth();
            float zoomScale;
            /** 方式1 **/
            // if(rWidth/rHeight>width/height){//以高为准
            // zoomScale=((float) rHeight) / height;
            // }else{
            // //if(rWidth/rHeight<width/height)//以宽为准
            // zoomScale=((float) rWidth) / width;
            // }
            /** 方式2 **/
            // if(width*1.5 >= height) {//以宽为准
            // if(width >= rWidth)
            // zoomScale = ((float) rWidth) / width;
            // else
            // zoomScale = 1.0f;
            // }else {//以高为准
            // if(height >= rHeight)
            // zoomScale = ((float) rHeight) / height;
            // else
            // zoomScale = 1.0f;
            // }
            /** 方式3 **/
            if (width >= rWidth)
                zoomScale = ((float) rWidth) / width;
            else
                zoomScale = 1.0f;
            // 创建操作图片用的matrix对象
            Matrix matrix = new Matrix();
            // 缩放图片动作
            matrix.postScale(zoomScale, zoomScale);
            Bitmap resizedBitmap = Bitmap.createBitmap(bitmap, 0, 0,
                    bitmap.getWidth(), bitmap.getHeight(), matrix, true);
            return resizedBitmap;
        }
    
        /**
         * 将Drawable转化为Bitmap
         * 
         * @param drawable
         * @return
         */
        public static Bitmap drawableToBitmap(Drawable drawable) {
            int width = drawable.getIntrinsicWidth();
            int height = drawable.getIntrinsicHeight();
            Bitmap bitmap = Bitmap.createBitmap(width, height, drawable
                    .getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888
                    : Bitmap.Config.RGB_565);
            Canvas canvas = new Canvas(bitmap);
            drawable.setBounds(0, 0, width, height);
            drawable.draw(canvas);
            return bitmap;
    
        }
    
        /**
         * 获得圆角图片的方法
         * 
         * @param bitmap
         * @param roundPx
         *            一般设成14
         * @return
         */
        public static Bitmap getRoundedCornerBitmap(Bitmap bitmap, float roundPx) {
    
            Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
                    bitmap.getHeight(), Config.ARGB_8888);
            Canvas canvas = new Canvas(output);
    
            final int color = 0xff424242;
            final Paint paint = new Paint();
            final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
            final RectF rectF = new RectF(rect);
    
            paint.setAntiAlias(true);
            canvas.drawARGB(0, 0, 0, 0);
            paint.setColor(color);
            canvas.drawRoundRect(rectF, roundPx, roundPx, paint);
    
            paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
            canvas.drawBitmap(bitmap, rect, rect, paint);
    
            return output;
        }
    
        /**
         * 获得带倒影的图片方法
         * 
         * @param bitmap
         * @return
         */
        public static Bitmap createReflectionImageWithOrigin(Bitmap bitmap) {
            final int reflectionGap = 4;
            int width = bitmap.getWidth();
            int height = bitmap.getHeight();
    
            Matrix matrix = new Matrix();
            matrix.preScale(1, -1);
    
            Bitmap reflectionImage = Bitmap.createBitmap(bitmap, 0, height / 2,
                    width, height / 2, matrix, false);
    
            Bitmap bitmapWithReflection = Bitmap.createBitmap(width,
                    (height + height / 2), Config.ARGB_8888);
    
            Canvas canvas = new Canvas(bitmapWithReflection);
            canvas.drawBitmap(bitmap, 0, 0, null);
            Paint deafalutPaint = new Paint();
            canvas.drawRect(0, height, width, height + reflectionGap, deafalutPaint);
    
            canvas.drawBitmap(reflectionImage, 0, height + reflectionGap, null);
    
            Paint paint = new Paint();
            LinearGradient shader = new LinearGradient(0, bitmap.getHeight(), 0,
                    bitmapWithReflection.getHeight() + reflectionGap, 0x70ffffff,
                    0x00ffffff, TileMode.CLAMP);
            paint.setShader(shader);
            // Set the Transfer mode to be porter duff and destination in
            paint.setXfermode(new PorterDuffXfermode(Mode.DST_IN));
            // Draw a rectangle using the paint with our linear gradient
            canvas.drawRect(0, height, width, bitmapWithReflection.getHeight()
                    + reflectionGap, paint);
    
            return bitmapWithReflection;
        }
    
        /**
         * 将bitmap转化为drawable
         * 
         * @param bitmap
         * @return
         */
        public static Drawable bitmapToDrawable(Bitmap bitmap) {
            Drawable drawable = new BitmapDrawable(bitmap);
            return drawable;
        }
    
        /**
         * 获取图片类型
         * 
         * @param file
         * @return
         */
        public static String getImageType(File file) {
            if (file == null || !file.exists()) {
                return null;
            }
            InputStream in = null;
            try {
                in = new FileInputStream(file);
                String type = getImageType(in);
                return type;
            } catch (IOException e) {
                return null;
            } finally {
                try {
                    if (in != null) {
                        in.close();
                    }
                } catch (IOException e) {
                }
            }
        }
    
        /**
         * 获取图片的类型信息
         * 
         * @param in
         * @return
         * @see #getImageType(byte[])
         */
        public static String getImageType(InputStream in) {
            if (in == null) {
                return null;
            }
            try {
                byte[] bytes = new byte[8];
                in.read(bytes);
                return getImageType(bytes);
            } catch (IOException e) {
                return null;
            }
        }
    
        /**
         * 获取图片的类型信息
         * 
         * @param bytes
         *            2~8 byte at beginning of the image file
         * @return image mimetype or null if the file is not image
         */
        public static String getImageType(byte[] bytes) {
            if (isJPEG(bytes)) {
                return "image/jpeg";
            }
            if (isGIF(bytes)) {
                return "image/gif";
            }
            if (isPNG(bytes)) {
                return "image/png";
            }
            if (isBMP(bytes)) {
                return "application/x-bmp";
            }
            return null;
        }
    
        private static boolean isJPEG(byte[] b) {
            if (b.length < 2) {
                return false;
            }
            return (b[0] == (byte) 0xFF) && (b[1] == (byte) 0xD8);
        }
    
        private static boolean isGIF(byte[] b) {
            if (b.length < 6) {
                return false;
            }
            return b[0] == 'G' && b[1] == 'I' && b[2] == 'F' && b[3] == '8'
                    && (b[4] == '7' || b[4] == '9') && b[5] == 'a';
        }
    
        private static boolean isPNG(byte[] b) {
            if (b.length < 8) {
                return false;
            }
            return (b[0] == (byte) 137 && b[1] == (byte) 80 && b[2] == (byte) 78
                    && b[3] == (byte) 71 && b[4] == (byte) 13 && b[5] == (byte) 10
                    && b[6] == (byte) 26 && b[7] == (byte) 10);
        }
    
        private static boolean isBMP(byte[] b) {
            if (b.length < 2) {
                return false;
            }
            return (b[0] == 0x42) && (b[1] == 0x4d);
        }
    }
  • 相关阅读:
    20190905-3 命令行和控制台编程
    作业要求 20181009-9 每周例行报告
    每周例行报告
    单元测试,结对
    四则运算试题生成
    代码规范,结对要求
    规格说明书-吉林市2日游
    功能测试
    每周例行报告2
    get与post请求的区别
  • 原文地址:https://www.cnblogs.com/hikigaya-yukino/p/4171402.html
Copyright © 2020-2023  润新知