zoukankan      html  css  js  c++  java
  • 图片的工具类

    // 压缩图片

    public final class ImageTools {
    
        /**
         * 
         * */
        public static int computeSampleSize(BitmapFactory.Options options,
                int minSideLength, int maxNumOfPixels) {
            int initialSize = computeInitialSampleSize(options, minSideLength,
                    maxNumOfPixels);
            int roundedSize;
            if (initialSize <= 8) {
                roundedSize = 1;
                while (roundedSize < initialSize) {
                    roundedSize <<= 1;
                }
            } else {
                roundedSize = (initialSize + 7) / 8 * 8;
            }
            return roundedSize;
        }
    
        private static int computeInitialSampleSize(BitmapFactory.Options options,
                int minSideLength, int maxNumOfPixels) {
            double w = options.outWidth;
            double h = options.outHeight;
            int lowerBound = (maxNumOfPixels == -1) ? 1 : (int) Math.ceil(Math
                    .sqrt(w * h / maxNumOfPixels));
            int upperBound = (minSideLength == -1) ? 128 : (int) Math.min(                 //128
                    Math.floor(w / minSideLength), Math.floor(h / minSideLength));
            if (upperBound < lowerBound) {
                return lowerBound;
            }
            if ((maxNumOfPixels == -1) && (minSideLength == -1)) {
                return 1;
            } else if (minSideLength == -1) {
                return lowerBound;
            } else {
                return upperBound;
            }
        }
    
        /**
         * 根据URI获取图片物理路径
         * 
         * */
        public static String getAbsoluteImagePath(Uri uri, Activity activity) {
            String[] proj = { MediaStore.Images.Media.DATA };
            Cursor cursor = activity.managedQuery(uri, proj, null, null, null);
            int column_index = cursor
                    .getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
            cursor.moveToFirst();
            return cursor.getString(column_index);
        }
    
        // 根据路径,和压缩后宽高获取图片 , 
        public static Bitmap getImageBitmap(String path,int width,int height) throws FileNotFoundException,
                IOException {
            Bitmap bmp = null;
            BitmapFactory.Options opts = new BitmapFactory.Options();
            opts.inJustDecodeBounds = true;
            BitmapFactory.decodeFile(path, opts);
            opts.inSampleSize = ImageTools.computeSampleSize(opts, -1, width * height);// 得到缩略图
            opts.inJustDecodeBounds = false;
            try {
                bmp = BitmapFactory.decodeFile(path, opts);
            } catch (OutOfMemoryError e) {
                LogUtils.d(e.getMessage());
            }
            return bmp;
        }
    
    }
    // 路径  压缩到常见屏幕 800*480分辨率,  写到sd卡
        // 路径  压缩到常见屏幕 800*480分辨率,  写到sd卡
        private static File getimage(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);
            
            bitmap = compressImage(bitmap);  //质量压缩
            File file=null;
            try {
    
                File rootFile = Environment.getExternalStorageDirectory();
                File tempFile = new File(rootFile, "guangyuanwang");
                if (!tempFile.exists()) {
                    tempFile.mkdirs();
                }
                String[] split = srcPath.split("/");
    
                 file = new File(tempFile, split[split.length - 1]);
                FileOutputStream outputStream = null;
    
                outputStream = new FileOutputStream(file);
                bitmap.compress(CompressFormat.PNG, 100, outputStream); //写到sd卡
                if (outputStream != null)
                    outputStream.close();
                
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            return file;// 压缩好比例大小后再进行质量压缩
        }
        
        // 根据 压缩到常见屏幕 800*480分辨率
        private Bitmap comp(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   
                image.compress(Bitmap.CompressFormat.JPEG, 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);//压缩好比例大小后再进行质量压缩   
      }  
  • 相关阅读:
    编写一个函数将一个十六进制数的字符串参数转换成整数返回?
    设置一段文字的大小为6px?
    写clone()方法时,通常都有一行代码,是什么?
    abstract class和interface有什么区别?
    JDBC中的Statement 和PreparedStatement的区别?
    什么是MVC模式?   
    Struts2的Action中获取request对象的几种方式?
    Struts2的功能扩展点有哪些?
    说说&和&&的区别?
    Struts2里面有什么隐式对象?
  • 原文地址:https://www.cnblogs.com/java-g/p/4598624.html
Copyright © 2011-2022 走看看