美文网首页Android开发常用代码andnroid
Android下Bitmap转换与处理相关工具类

Android下Bitmap转换与处理相关工具类

作者: 吕中宜 | 来源:发表于2015-11-25 11:55 被阅读2790次

    转载自http://glblong.blog.51cto.com/3058613/1304090

    将view转为bitmap(一)
    public static Bitmap getBitmapFromView(View view)
    {
        // Define a bitmap with the same size as the view
        Bitmap returnedBitmap = Bitmap.createBitmap(view.getWidth(), view.getHeight(), Bitmap.Config.ARGB_8888);
        // Bind a canvas to it
        Canvas canvas = new Canvas(returnedBitmap);
        // Get the view's background
        Drawable bgDrawable = view.getBackground();
        if (bgDrawable != null)
            // has background drawable, then draw it on the canvas
            bgDrawable.draw(canvas);
        else
            // does not have background drawable, then draw white background on
            // the canvas
            canvas.drawColor(Color.WHITE);
        // draw the view on the canvas
        view.draw(canvas);
        // return the bitmap
        return returnedBitmap;
    }
    
    将view转为bitmap(二)
    public static Bitmap viewToBitmap(View view)
    {
        view.setDrawingCacheEnabled(true);
        view.buildDrawingCache();
        Bitmap bm = view.getDrawingCache();
        return bm;
    }
    
    将xml转为bitmap
    public static Bitmap convertBitmapFromXML(Context context, String clusterSize, Bitmap bm)
    {
                                                                                                                                                                                                                                                                                                                                                                                            
        View layout = LayoutInflater.from(context).inflate(R.layout.estatecartlist_item, null);
        View bitmapView = layout.findViewById(R.id.estatecartlist_item_bitmap);
        TextView xml_text = (TextView) layout.findViewById(R.id.item_estatecart_tv_name);
        ImageView image = (ImageView) layout.findViewById(R.id.item_estatecart_iv_main);
        image.setImageBitmap(bm);
        xml_text.setText(clusterSize);
                                                                                                                                                                                                                                                                                                                                                                                            
        bitmapView.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED), MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
                                                                                                                                                                                                                                                                                                                                                                                            
        bitmapView.layout(0, 0, bitmapView.getMeasuredWidth(), bitmapView.getMeasuredHeight());
                                                                                                                                                                                                                                                                                                                                                                                            
        final Bitmap clusterBitmap = Bitmap.createBitmap(bitmapView.getMeasuredWidth(), bitmapView.getMeasuredHeight(), Bitmap.Config.ARGB_8888);
                                                                                                                                                                                                                                                                                                                                                                                            
        Canvas canvas = new Canvas(clusterBitmap);
        bitmapView.draw(canvas);
        return clusterBitmap;
    }
    
    图片缩放与压缩
    // 按大小缩放
    private Bitmap 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);
        return compressImage(bitmap);// 压缩好比例大小后再进行质量压缩
    }
    // 图片质量压缩
    private static Bitmap compressImage(Bitmap image)
    {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        image.compress(Bitmap.CompressFormat.JPEG, 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;
    }
    // 图片按比例大小压缩
    private static 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);// 压缩好比例大小后再进行质量压缩
    }
    
    图片转为文件
    public static boolean saveBitmap2file(Bitmap bmp, String filename)
    {
        CompressFormat format = Bitmap.CompressFormat.JPEG;
        int quality = 100;
        OutputStream stream = null;
        try
        {
            stream = new FileOutputStream("/sdcard/" + filename);
        }
        catch (FileNotFoundException e)
        {
            e.printStackTrace();
        }
                                                                                                                                                                                                                                                                                                                                                                          
        return bmp.compress(format, quality, stream);
    }
    
    屏幕截屏
    // 屏幕截屏方法 获取当前屏幕bitmap,转换成bytes[] 调用 UI分享方法
    public void printscreen_share(View v)
    {
        View view1 = getWindow().getDecorView();
        Display display = getWindowManager().getDefaultDisplay();
        view1.layout(0, 0, display.getWidth(), display.getHeight());
        view1.setDrawingCacheEnabled(true);
        Bitmap bitmap = Bitmap.createBitmap(view1.getDrawingCache());
    }
    
    把Bitmap转成Byte
    public static byte[] Bitmap2Bytes(Bitmap bm)
    {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bm.compress(Bitmap.CompressFormat.PNG, 100, baos);
        return baos.toByteArray();
    }
    
    图片转为文件
    public static boolean saveBitmap2file(Bitmap bmp)
    {
        CompressFormat format = Bitmap.CompressFormat.PNG;
        int quality = 100;
        OutputStream stream = null;
        try
        {
            // 判断SDcard状态
            if (!Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()))
            {
                // 错误提示
                return false;
            }
                                                                                                                                                                                                                                                                                                            
            // 检查SDcard空间
            File SDCardRoot = Environment.getExternalStorageDirectory();
            if (SDCardRoot.getFreeSpace() < 10000)
            {
                // 弹出对话框提示用户空间不够
                Log.e("Utils", "存储空间不够");
                return false;
            }
                                                                                                                                                                                                                                                                                                            
            // 在SDcard创建文件夹及文件
            File bitmapFile = new File(SDCardRoot.getPath() + FILE_PATH);
            bitmapFile.getParentFile().mkdirs();// 创建文件夹
            stream = new FileOutputStream(SDCardRoot.getPath() + FILE_PATH);// "/sdcard/"
        }
        catch (FileNotFoundException e)
        {
            e.printStackTrace();
        }
        return bmp.compress(format, quality, stream);
    }
    
    下载图片
    public static Bitmap loadImage(String... params)
    {
        InputStream is = null;
        Bitmap bitmap = null;
        try
        {
            URL url = new URL(params[0]);
            HttpURLConnection conn = (HttpURLConnection) url.openConnection();
            conn.setReadTimeout(5000);
            conn.setConnectTimeout(5000);
            if (HttpURLConnection.HTTP_OK != conn.getResponseCode())
            {
                // 网络连接异常
                Log.e("", "loadImage连接异常");
                return null;
            }
                                                                                                                                                                                                                                                                               
            is = conn.getInputStream();
            bitmap = BitmapFactory.decodeStream(is);
                                                                                                                                                                                                                                                                               
        }
        catch (MalformedURLException e)
        {
            e.printStackTrace();
        }
        catch (IOException e)
        {
            e.printStackTrace();
        }
        finally
        {
            if (null != is)
            {
                try
                {
                    is.close();
                }
                catch (IOException e)
                {
                    e.printStackTrace();
                }
            }
        }
        return bitmap;
    }
    
    byte[]转换成Bitmap
    public static Bitmap Bytes2Bitmap(byte[] b)
    {
        if (b.length != 0)
        {
            return BitmapFactory.decodeByteArray(b, 0, b.length);
        }
        return null;
    }
    
    将字符串转换成Bitmap类型
    public static Bitmap stringtoBitmap(String string)
    {
        // 将字符串转换成Bitmap类型
        Bitmap bitmap = null;
        try
        {
            byte[] bitmapArray;
            bitmapArray = Base64.decode(string, Base64.DEFAULT);
            bitmap = BitmapFactory.decodeByteArray(bitmapArray, 0, bitmapArray.length);
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
                                                                                                                                                                                                                                                 
        return bitmap;
    }
    
    将Bitmap转换成字符串
    public static String bitmaptoString(Bitmap bitmap)
    {
        String string = null;
        ByteArrayOutputStream bStream = new ByteArrayOutputStream();
        bitmap.compress(CompressFormat.PNG, 100, bStream);
        byte[] bytes = bStream.toByteArray();
        string = Base64.encodeToString(bytes, Base64.DEFAULT);
        return string;
    }
    
    byte[]转为文件
    public static File getFileFromBytes(byte[] b)
    {
        BufferedOutputStream stream = null;
        File file = null;
        try
        {
            // 判断SDcard状态
            if (!Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState()))
            {
                // 错误提示
                return null;
            }
                                                                                                                                                                                                                           
            // 检查SDcard空间
            File SDCardRoot = Environment.getExternalStorageDirectory();
            if (SDCardRoot.getFreeSpace() < 10000)
            {
                // 弹出对话框提示用户空间不够
                Log.e("Utils", "存储空间不够");
                return null;
            }
                                                                                                                                                                                                                           
            // 在SDcard创建文件夹及文件
            File bitmapFile = new File(SDCardRoot.getPath() + FILE_PATH);
            bitmapFile.getParentFile().mkdirs();// 创建文件夹
                                                                                                                                                                                                                           
            FileOutputStream fstream = new FileOutputStream(bitmapFile);
            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;
    }
    
    图片压缩
    //图片缩放
    public static Bitmap scaleDownBitmap(Bitmap photo, int newHeight, Context context)
    {
                                                                                                                                                                                                            
        final float densityMultiplier = context.getResources().getDisplayMetrics().density;
                                                                                                                                                                                                            
        int h = (int) (newHeight * densityMultiplier);
        int w = (int) (h * photo.getWidth() / ((double) photo.getHeight()));
                                                                                                                                                                                                            
        photo = Bitmap.createScaledBitmap(photo, w, h, true);
                                                                                                                                                                                                            
        return photo;
    }
    
    将byte[]转换成InputStream
    public InputStream Byte2InputStream(byte[] b)
    {
        ByteArrayInputStream bais = new ByteArrayInputStream(b);
        return bais;
    }
    
    将InputStream转换成byte[]
    public byte[] InputStream2Bytes(InputStream is)
    {
        String str = "";
        byte[] readByte = new byte[1024];
        int readCount = -1;
        try
        {
            while ((readCount = is.read(readByte, 0, 1024)) != -1)
            {
                str += new String(readByte).trim();
            }
            return str.getBytes();
        }
        catch (Exception e)
        {
            e.printStackTrace();
        }
        return null;
    }
    
    将Bitmap转换成InputStream(一)
    public InputStream Bitmap2InputStream(Bitmap bm)
    {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bm.compress(Bitmap.CompressFormat.JPEG, 100, baos);
        InputStream is = new ByteArrayInputStream(baos.toByteArray());
        return is;
    }
    
    将Bitmap转换成InputStream(二)
    public InputStream Bitmap2InputStream(Bitmap bm, int quality)
    {
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        bm.compress(Bitmap.CompressFormat.PNG, quality, baos);
        InputStream is = new ByteArrayInputStream(baos.toByteArray());
        return is;
    }
    
    将InputStream转换成Bitmap
    public Bitmap InputStream2Bitmap(InputStream is)
    {
        return BitmapFactory.decodeStream(is);
    }
    
    Drawable转换成InputStream
    public InputStream Drawable2InputStream(Drawable d)
    {
        Bitmap bitmap = this.drawable2Bitmap(d);
        return this.Bitmap2InputStream(bitmap);
    }
    
    InputStream转换成Drawable
    public Drawable InputStream2Drawable(InputStream is)
    {
        Bitmap bitmap = this.InputStream2Bitmap(is);
        return this.bitmap2Drawable(bitmap);
    }
    
    Drawable转换成byte[]
    public byte[] Drawable2Bytes(Drawable d)
    {
        Bitmap bitmap = this.drawable2Bitmap(d);
        return this.Bitmap2Bytes(bitmap);
    }
    
    byte[]转换成Drawable
    public Drawable Bytes2Drawable(byte[] b)
    {
        Bitmap bitmap = this.Bytes2Bitmap(b);
        return this.bitmap2Drawable(bitmap);
    }
    
    Drawable转换成Bitmap
    public Bitmap drawable2Bitmap(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;
    }
    
    Bitmap转换成Drawable
    public Drawable bitmap2Drawable(Bitmap bitmap)
    {
        BitmapDrawable bd = new BitmapDrawable(bitmap);
        Drawable d = (Drawable) bd;
        return d;
    }
    
    bitmap灰度化(一)
    public static Bitmap bitmap2Gray(Bitmap bitmap) {
        //得到图片的长和宽
        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        //创建目标灰度图像
        Bitmap grayBitmap = null;
        grayBitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        //创建画布
        Canvas c = new Canvas(grayBitmap);
        Paint paint = new Paint();
        ColorMatrix cm = new ColorMatrix();
        //将社彩饱和度设置为0
        cm.setSaturation(0);
        ColorMatrixColorFilter f = new ColorMatrixColorFilter(cm);
        c.drawBitmap(bitmap, 0, 0, paint);
        return grayBitmap;
    }
    
    bitmap灰度化(二)
    public static Bitmap sharpenImageGary(Bitmap bitmap) {
        long start = System.currentTimeMillis();
        int height = bitmap.getHeight();
        int width = bitmap.getWidth();
        int[] pix = new int[width * height];
        bitmap.getPixels(pix, 0, width, 0, 0, width, height);
        int R, G, B;
        for (int y = 0; y < height; y++)
            for (int x = 0; x < width; x++) {
                int index = y * width + x;
                int r = (pix[index] >> 16) & 0xff;
                int g = (pix[index] >> 8) & 0xff;
                int b = pix[index] & 0xff;
                int s = (r + g + b) / 3;
                // 图像黑白化
                R = s;
                R = (R < 0) ? 0 : ((R > 255) ? 255 : R);
                G = s;
                G = (G < 0) ? 0 : ((G > 255) ? 255 : G);
                B = s;
                B = (B < 0) ? 0 : ((B > 255) ? 255 : B);
                pix[index] = 0xff000000 | (R << 16) | (G << 8) | B;
            }
        bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
        bitmap.setPixels(pix, 0, width, 0, 0, width, height);
        pix = null;
        long end = System.currentTimeMillis();
        Log.e("图像黑白化", "used time=" + (end - start));
        try {
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.JPEG, 100, out);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return bitmap;
    }
    
    bitmap锐化(拉普拉斯变换)
    public static Bitmap sharpenImageAmeliorate(Bitmap bmp){
        long start = System.currentTimeMillis();
        // 拉普拉斯矩阵
        int[] laplacian = new int[] { -1, -1, -1, -1, 9, -1, -1, -1, -1 };
    
        int width = bmp.getWidth();
        int height = bmp.getHeight();
        //Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
        Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
    
    
        int pixR = 0;
        int pixG = 0;
        int pixB = 0;
    
        int pixColor = 0;
    
        int newR = 0;
        int newG = 0;
        int newB = 0;
    
        int idx = 0;
        float alpha = 0.3F;
        int[] pixels = new int[width * height];
        bmp.getPixels(pixels, 0, width, 0, 0, width, height);
        for (int i = 1, length = height - 1; i < length; i++)
        {
            for (int k = 1, len = width - 1; k < len; k++)
            {
                idx = 0;
                for (int m = -1; m <= 1; m++)
                {
                    for (int n = -1; n <= 1; n++)
                    {
                        pixColor = pixels[(i + n) * width + k + m];
                        pixR = Color.red(pixColor);
                        pixG = Color.green(pixColor);
                        pixB = Color.blue(pixColor);
    
                        newR = newR + (int) (pixR * laplacian[idx] * alpha);
                        newG = newG + (int) (pixG * laplacian[idx] * alpha);
                        newB = newB + (int) (pixB * laplacian[idx] * alpha);
                        idx++;
                    }
                }
    
                newR = Math.min(255, Math.max(0, newR));
                newG = Math.min(255, Math.max(0, newG));
                newB = Math.min(255, Math.max(0, newB));
    
                pixels[i * width + k] = Color.argb(255, newR, newG, newB);
                newR = 0;
                newG = 0;
                newB = 0;
            }
        }
    
        bitmap.setPixels(pixels, 0, width, 0, 0, width, height);
        long end = System.currentTimeMillis();
        Log.e("图片锐化", "used time="+(end - start));
        try {
            ByteArrayOutputStream out = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.JPEG, 90, out);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return bitmap;
    }
    

    相关文章

      网友评论

        本文标题:Android下Bitmap转换与处理相关工具类

        本文链接:https://www.haomeiwen.com/subject/zdarhttx.html