Bitmap长方形图片加载为圆形图片

package com.lib.andlib_libtemp.example.dir.exam1;

import android.graphics.Bitmap;import android.graphics.Matrix;import android.view.View;

import com.lib.andlib_libtemp.utils.LogUtil;

/** * Created by envy15 on 2016/6/16. * 根据View的比例剪切图片大小工具类 * 剪切模式:中间、上、下 */public class BitmapCatUtil {    public static Bitmap imageCatByCenter(View mView, Bitmap source) {        //先获取View的高度,获取失败将返回原图        getImageViewPixSize(mView);        /**         * 获取图片Bitmap的宽高         */        int suWidth = source.getWidth();        int suHeight = source.getHeight();        if(ivWidth == 0 || ivHeight == 0)        {            LogUtil.infoE("获取View宽高失败:ivHeight=" + ivHeight +"  ivWidth=" + ivWidth);            return source;        }

        /**         * Y方向上应该截取的长度         */        int yAxisAdd = ivHeight * suWidth / ivWidth;

        if (yAxisAdd == suHeight) {   //!!!            //裁剪的宽高与图片的宽高一样时,bitmap的返回的引用是source,因此不能回收,直接返回            //回收抛异常:java.lang.IllegalStateException: Transformation SizeTransformation returned input Bitmap but recycled it            return source;        } else {            //按比例截取多余的高度            if (yAxisAdd < suHeight)   //截取的高度需小于源图片的高度            {                //(起点左边,截取宽度,截取高度)                Bitmap bitmap = Bitmap.createBitmap(source,                        0, suHeight / 2 - yAxisAdd / 2,                        suWidth,yAxisAdd);                source.recycle();                return bitmap;            } else { //否则需按比例截取宽度                int xAxisAdd = ivWidth * suHeight / ivHeight;                Bitmap bitmap = Bitmap.createBitmap(source,                        suWidth / 2 - xAxisAdd / 2, 0,                        xAxisAdd, suHeight);                source.recycle();

                return bitmap;            }        }    }

    /**     * 返回图片控件表示的宽高像素大小     * 必须指定图片的大小,wrap_content/match_parent均无法获取宽高     * 参考     * http://blog.csdn.net/crazy1235/article/details/41806079     */    private static int ivHeight;    private static int ivWidth;    private static void getImageViewPixSize(View imageView) {        //获取宽高OK        ivHeight = imageView.getLayoutParams().height;        ivWidth = imageView.getLayoutParams().width;    }

    /**     * 获取Bitmap缩放比例     */    public static float catScale(View mView, Bitmap bitmap) {        return mView.getLayoutParams().height*1.0f/bitmap.getHeight();    }

    /**     * Bitmap放大/缩小的方法     * @param bitmap     * @return bitmap     */    public static Bitmap bitmapScaling(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;    }}

+++++++++++++++++++++++++++++++
package com.lib.andlib_libtemp.example.dir.exam1;

import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.graphics.PorterDuff;import android.graphics.PorterDuffXfermode;import android.graphics.Rect;import android.graphics.RectF;import android.graphics.drawable.BitmapDrawable;import android.graphics.drawable.Drawable;import android.view.View;

/** * Created by envy15 on 2016/6/16. * 位图的绘制工具类:圆角 * */public class BitmapShapeUtil {    /**四个圆角的圆角图片     * 四个圆角,roundRadius = bitmap.getWidth()/2 绘制为圆形图像     * @param bitmap 位图     * @param roundRadius 圆角大小     * @return 圆角图片     */    public static Bitmap getRoundedCornerBitmap(Bitmap bitmap,float roundRadius) {        // 创建一个指定宽度和高度的空位图对象        Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),                bitmap.getHeight(), Bitmap.Config.ARGB_8888);        // 用该位图创建画布        Canvas canvas = new Canvas(output);        // 画笔对象        final Paint paint = new Paint();        // 画笔的颜色        final int color = 0xff424242;        // 矩形区域对象        final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());        // 未知        final RectF rectF = new RectF(rect);        // 拐角的半径        final float roundPx = roundRadius;        // 消除锯齿        paint.setAntiAlias(true);        // 画布背景色        canvas.drawARGB(0, 0, 0, 0);        // 设置画笔颜色        paint.setColor(color);        // 绘制圆角矩形        canvas.drawRoundRect(rectF, roundPx, roundPx, paint);        // 未知        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));        // 把该图片绘制在该圆角矩形区域中        canvas.drawBitmap(bitmap, rect, rect, paint);        // 最终在画布上呈现的就是该圆角矩形图片,然后我们返回该Bitmap对象        return output;    }

    /**可实现动态绘制圆角     * 生成四个圆角的背景     * @param mView 根据View计算Drawable大小     * @param roundRadius 绘制半径     * @return Drawable     * exam imageView.setBackground(BitmapShapeUtil.getRoundedCornerDrawable(imageView,imageView.     *       getLayoutParams().width/5, Color.GRAY));     */    public static Drawable getRoundedCornerDrawable(View mView, float roundRadius,int color) {        int hight = mView.getLayoutParams().height;        int width = mView.getLayoutParams().width;        Bitmap rounder = Bitmap.createBitmap(width, hight, Bitmap.Config.ARGB_8888);        Canvas canvas = new Canvas(rounder);        Paint xferPaint = new Paint(Paint.ANTI_ALIAS_FLAG);        xferPaint.setColor(color);        canvas.drawRoundRect(new RectF(0, 0, width, hight), roundRadius, roundRadius, xferPaint);        xferPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));        canvas.drawBitmap(rounder, 0, 0, null);        canvas.drawBitmap(rounder, 0, 0, xferPaint);

        Drawable drawable = new BitmapDrawable(rounder);        return drawable;    }}
+++++++++++++++++++++++++++++++
    @Override    public void initDatas() {        LogUtil.infoD(this, "initDatas");        //OK        Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.mipmap.image_girl_test1);        LogUtil.infoE(this,bitmap.getHeight()+" "+bitmap.getWidth());        //裁剪图片        bitmap = BitmapCatUtil.imageCatByCenter(imageView,bitmap);        LogUtil.infoE(this,bitmap.getHeight()+" "+bitmap.getWidth());        LogUtil.infoE(this,imageView.getLayoutParams().height+" "+imageView.getLayoutParams().width);        //缩放处理        bitmap = BitmapCatUtil.bitmapScaling(bitmap,BitmapCatUtil.catScale(imageView,bitmap));        //圆角处理        Bitmap roundedCornerBitmap = BitmapShapeUtil.getRoundedCornerBitmap(                bitmap,bitmap.getWidth()/2);        imageView.setImageBitmap(roundedCornerBitmap);

//        imageView.setBackground(BitmapShapeUtil.getRoundedCornerDrawable(imageView,imageView.//                getLayoutParams().width/5, Color.GRAY));

    }
				
时间: 2024-10-29 12:49:35

Bitmap长方形图片加载为圆形图片的相关文章

Android常用的图片加载库

 Android常用的图片加载库 前言:图片加载涉及到图片的缓存.图片的处理.图片的显示等.四种常用的图片加载框架,分别是Fresco.ImageLoader. Picasso. Glide. Universal Image Loader:ImageLoader是比较老的框架,一个强大的图片加载库,包含各种各样的配置,最老牌,使用也最广泛. ImageLoader开源库存哪些特征: 1.多线程下载图片,图片可以来源于网络,文件系统,项目文件夹assets中以及drawable中等 2.支持随意的

Android中常见的图片加载框架

图片加载涉及到图片的缓存.图片的处理.图片的显示等.而随着市面上手机设备的硬件水平飞速发展,对图片的显示要求越来越高,稍微处理不好就会造成内存溢出等问题.很多软件厂家的通用做法就是借用第三方的框架进行图片加载. 开源框架的源码还是挺复杂的,但使用较为简单.大部分框架其实都差不多,配置稍微麻烦点,但是使用时一般只需要一行,显示方法一般会提供多个重载方法,支持不同需要.这样会减少很不必要的麻烦.同时,第三方框架的使用较为方便,这大大的减少了工作量.提高了开发效率.本文主要介绍四种常用的图片加载框架,

Android的ImageLoader图片加载简单逻辑

1.以单例模式创建ImageLoader对象 2.初始化LruCache(最近最少使用算法的缓存工具类,http://www.cnblogs.com/tianzhijiexian/p/4248677.html),取可用内存的一部分用来存储图片 3.初始化DiskLruCache(硬盘缓存) 4.调用显示图片方法 如果使用资源ID,直接为ImageView设置图片 为ImageView设置tag为url Lrucache内存缓存取图片,如果有图片,设置图片,return 将图片加载请求加入图片加载

LrcCache和DiskLruCache相结合打造图片加载框架

LrcCache和DiskLruCache相结合打造图片加载框架 1概述 这几在研究图片加载的方面的知识,在网上看了一下前辈们写的文章,受到了一些启发,于是综合多方面的知识,将这些整合起来,自己边写了一个图片加载框架.说到图片加载最容易出问题的就是OOM就是内存溢出,所以一定要限制加载图片时使用的内存,这就使用到Android提供的缓存类LruCache,关于LruCache的知识这里不再赘述,大家自行学习.但是如果图片非常的多而且频繁操作的话,加上LruCache的缓存空间有限,缓存就不得不经

iOS开发——图形编程Swift篇&amp;CAShapeLayer实现圆形图片加载动画

CAShapeLayer实现圆形图片加载动画 几个星期之前,Michael Villar在Motion试验中创建一个非常有趣的加载动画. 下面的GIF图片展示这个加载动画,它将一个圆形进度指示器和圆形渐现动画结合.这个组合的效果有趣,独一无二和有点迷人. 这个教程将会教你如何使用Swift和Core Animatoin来重新创建这个效果.让我们开始吧! 基础 首先下载这个教程的启动项目,然后编译和运行.过一会之后,你应该看到一个简单的image显示: 这 个启动项目已经预先在恰当的位置将view

使用CAShapeLayer来实现圆形图片加载动画(objective c)实现

使用CAShapeLayer来实现圆形图片加载动画(objective c)实现 by 伍雪颖 效果图 博客地址: 英文链接 中文链接 代码实现: swift实现中文链接有 objective c实现(github)

iOS 图片加载 圆形进度条

项目中有加载网络图片的需求,加一个加载的进度条会提高用户体验,网络不好的时候会清晰的看到图片加载的进度,比让用户看着满屏幕空白好.下面是我们项目自己封装的圆形进度条,分享给大家. 其实实现原理很简单,只是根据图片加载的进度来绘制一个圆. 先来看.h文件,需要一个进度的属性和进度条展示位置的方法: @property (nonatomic, assign) CGFloat progress; +(HMProgressView *)showHMProgressView:(UIView *)paren

图片加载框架之ImageLoader

Android开发中,多少会接触到异步加载图片,或者加载大量图片的问题,而加载图片我们常常会遇到许多的问题,比如说图片的错乱,OOM等问题,对于这些问题解决起来会比较吃力,比较著名的就是Universal-Image-Loader,该项目可以在于Github搜索到. 特征: 多线程下载图片,图片可以来源于网络,文件系统,项目文件夹assets中以及drawable中等 支持随意的配置ImageLoader,例如线程池,图片下载器,内存缓存策略,硬盘缓存策略,图片显示选项以及其他的一些配置 支持图

图片加载框架之Glide和Picasso

Glide介绍 Glide是一个加载图片的库,作者是bumptech,它是在泰国举行的google 开发者论坛上google为我们介绍的,这个库被广泛的运用在google的开源项目中. Glide是一个非常成熟的图片加载库,他可以从多个源加载图片,如:网路,本地,Uri等,更重要的是他内部封装了非常好的缓存机制并且在处理图片的时候能保持一个低的内存消耗. Picasso介绍(毕加索) picasso是Square公司开源的一个Android图形缓存库,地址http://square.github