android图片分辨率改变,android 通过修改图片像素实现CircleImageView
CircleImageView实现方法有很多种,各有优缺点,因此需要按照不同的场景使用。我们今天使用修改图片像素的方法实现CircleImageView,主要知识点无非是勾股定理和点到圆形的距离。
素材图片:
效果如下:
1、clipPath裁剪画布
该方法支持的最小版本是Android 4.3(API Level 18),方便快捷,但是不支持硬件加,此外也存在Path既有的缺点,不支持抗锯齿。
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
Paint paint = new Paint();
mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.pic);
mPath = new Path();
mPath.addCircle(mBitmap.getWidth() / 2, mBitmap.getHeight() / 2, mBitmap.getWidth() / 2, Path.Direction.CCW);
canvas.clipPath(mPath);
canvas.drawBitmap(mBitmap, 0, 0, paint);
}
2、使用PorterDuffXfermode
PorterDuffXfermode是Android主流的图片合成工具,支持模式多,稳定性强,效果好,质量高,支持抗锯齿备受广大开发者喜爱,可以说是很多应用开发的首选。缺点是难度学习有些高,另外比较占内存。
/**
* 绘制圆形图片
*
*/
@Override
protected void onDraw(Canvas canvas) {
Drawable drawable = getDrawable();
if (null != drawable) {
Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
Bitmap b = getCircleBitmap(bitmap);
final Rect rectSrc = new Rect(0, 0, b.getWidth(), b.getHeight());
final Rect rectDest = new Rect(0,0,getWidth(),getHeight());
paint.reset();
canvas.drawBitmap(b, rectSrc, rectDest, paint);
} else {
super.onDraw(canvas);
}
}
/**
* 获取圆形图片方法
* @param bitmap
* @param pixels
* @return Bitmap
*/
private Bitmap getCircleBitmap(Bitmap bitmap) {
Bitmap output = Bitmap.createBitmap(bitmap.getWidth(),
bitmap.getHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(output);
final int color = 0xff424242;
final Rect rect = new Rect(0, 0, bitmap.getWidth(), bitmap.getHeight());
paint.setAntiAlias(true);
canvas.drawColor(Color.TRANSPARENT);
paint.setColor(color);
int x = bitmap.getWidth();
canvas.drawCircle(x / 2, x / 2, x / 2, paint);
paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(bitmap, rect, rect, paint);
return output;
}
4、设置画笔Paint的Shader,然后用该画笔绘制圆形图片
该方法是Glide和picasso使用的方法,用法简单便捷,占内占有率处于中等水平。
@Override
protected void onDraw(Canvas canvas) {
Drawable drawable = getDrawable();
if (null != drawable) {
Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap();
Bitmap b = transform(bitmap);
final Rect rectSrc = new Rect(0, 0, b.getWidth(), b.getHeight());
final Rect rectDest = new Rect(0,0,getWidth(),getHeight());
paint.reset();
canvas.drawBitmap(b, rectSrc, rectDest, paint);
} else {
super.onDraw(canvas);
}
}
public Bitmap transform(Bitmap source) {
int size = Math.min(source.getWidth(), source.getHeight());
int x = (source.getWidth() - size) / 2;
int y = (source.getHeight() - size) / 2;
Bitmap squaredBitmap = Bitmap.createBitmap(source, x, y, size, size);
if (squaredBitmap != source) {
source.recycle();
}
Bitmap bitmap = Bitmap.createBitmap(size, size, source.getConfig());
Canvas canvas = new Canvas(bitmap);
Paint paint = new Paint();
BitmapShader shader = new BitmapShader(squaredBitmap,
BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP);
float mScale = (mRadius * 2.0f) / Math.min(bitmap.getHeight(), bitmap.getWidth());
Matrix matrix = new Matrix();
matrix.setScale(mScale, mScale);
bitmapShader.setLocalMatrix(matrix);
paint.setShader(shader);
paint.setAntiAlias(true);
float r = size / 2f;
canvas.drawCircle(r, r, r, paint);
squaredBitmap.recycle();
return bitmap;
}
5、修改像素
该方法无法支持抗锯齿,并且不支持Bitmap.Config.HARDWARE格式的bitmap,但用法简单,内存占有率同样处于比较低。
public class CircleImageView extends AppCompatImageView {
public CircleImageView(Context context) {
this(context,null);
}
public CircleImageView(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public CircleImageView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public void onDraw(Canvas canvas) {
int width = getWidth();
int height = getHeight();
int minSize = Math.min(width,height)/2;
Drawable drawable = getDrawable();
if(drawable!=null && minSize!=0) {
if(Math.min(drawable.getIntrinsicWidth(),drawable.getIntrinsicHeight())==0) {
return;
}
int intrinsicWidth = drawable.getIntrinsicWidth();
int intrinsicHeight = drawable.getIntrinsicHeight();
float R = Math.min(intrinsicWidth, intrinsicHeight) / 2;
Bitmap bmp = transformBitmap(drawable, intrinsicWidth, intrinsicHeight, R);
Matrix imageMatrix = getImageMatrix();
if((imageMatrix==null || imageMatrix.isIdentity()) && getPaddingTop()==0 && getPaddingLeft()==0){
drawCircleImage(canvas, bmp);
}else {
if (imageMatrix != null && !imageMatrix.isIdentity()) {
canvas.concat(imageMatrix);
}
final int saveCount = canvas.getSaveCount();
canvas.save();
if (getCropToPadding()) {
final int scrollX = getScrollX();
final int scrollY = getScrollY();
canvas.clipRect(scrollX + getPaddingLeft(), scrollY + getPaddingTop(),
scrollX + getRight() - getLeft() - getPaddingRight(),
scrollY + getBottom() - getTop() - getPaddingBottom());
}
canvas.translate(getPaddingLeft(), getPaddingTop());
drawCircleImage(canvas, bmp);
canvas.restoreToCount(saveCount);
}
if(bmp!=null && !bmp.isRecycled()) {
bmp.recycle();
}
}else{
super.onDraw(canvas);
}
}
private void drawCircleImage(Canvas canvas, Bitmap bmp) {
try {
DrawFilter drawFilter = canvas.getDrawFilter();
canvas.setDrawFilter(new PaintFlagsDrawFilter(0, Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG));
canvas.drawBitmap(bmp, 0, 0, null);
canvas.setDrawFilter(drawFilter);
}catch (Exception e){
e.printStackTrace();
return;
}
}
@NonNull
private Bitmap transformBitmap(Drawable drawable, int intrinsicWidth, int intrinsicHeight, float r) {
Bitmap bmp = Bitmap.createBitmap(intrinsicWidth, intrinsicHeight, Bitmap.Config.ARGB_8888);
Canvas targetCanvas = new Canvas(bmp);
try {
drawable.draw(targetCanvas);
for (int y = 0; y < intrinsicHeight; y++) {
for (int x = 0; x < intrinsicWidth; x++) {
if ((Math.pow(x - intrinsicWidth / 2, 2) + Math.pow(y - intrinsicHeight / 2, 2)) <= Math.pow(r, 2)) {
continue;
}
bmp.setPixel(x, y, Color.TRANSPARENT);
}
}
}catch (Exception e){
NCFLog.e("transformBitmap","e="+e.getLocalizedMessage());
e.printStackTrace();
}
return bmp;
}
public boolean isHardware(Bitmap sourceBitmap){
if(sourceBitmap==null) return false;
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.O) {
return sourceBitmap.getConfig() == Bitmap.Config.HARDWARE;
}
return false;
}
}
android图片分辨率改变,android 通过修改图片像素实现CircleImageView相关推荐
- android图片分辨率改变,Android实现改变一个图片的像素值
如果你有一张图片,想实现把图片中某一类的像素点修改一下,例如:把一个图片中的全白的像素点改成你想要的颜色,可以通过如下方法实现 第一步:创建一个布局 android:orientation=" ...
- 计算机PS属性怎么改,电脑不用ps怎么改图片分辨率_教你修改图片分辨率的方法...
在网络生活中经常需要上传图片,可是网络上图片有限制的,需要调整一下图片分辨率,网上有很多调节方法,其中ps软件虽说很好用,但要下载安装显得很麻烦.其实我们可以使用编辑功能手动调节分辨率来获得想要的效果 ...
- 如何在Python中获取图片分辨率?——Python实现获取图片分辨率的代码及详解。
如何在Python中获取图片分辨率?--Python实现获取图片分辨率的代码及详解. 在进行图片处理或者图片分析的时候,获取图片的分辨率信息是必不可少的.Python提供了许多库可以方便地获取图片的分 ...
- **微信小程序图片上传+后台PHP修改图片名称**
微信小程序图片上传+后台PHP修改图片名称 前端代码:比较随意 <view class="weui-uploader"><view class="img ...
- 安卓手机怎么修改图片分辨率?手机怎么提高图片分辨率?
最近有很多小伙伴反映,在上传证件照时尺寸.颜色都调整到符合要求了,但就是上传不成功,这时候一般是大家忽略了图片分辨率的问题,有的证件照上传时是有特定的dpi要求,那么手机怎么修改分辨率呢?接下来给大家 ...
- android视频解码数据分辨率改变,Android实现任意分辨率视频编码的思考与实现
HardwareVideoCodec是一个高效的Android音视频编码库,支持软编和硬编.使用它你可以很容易的实现任何分辨率的视频编码,无需关心摄像头预览大小.一切都如此简单.目前已迭代多个稳定版本 ...
- 如何调整图片的dpi?如何修改图片分辨率?
如何修改图片分辨率?推荐使用压缩图的dpi调整工具直接在线修改分辨率(在线修改照片分辨率(DPI) 调整图片DPI 照片dpi修改工具-压缩图),操作简单易上手,快来试试看吧. 1.使用浏览器打开压缩 ...
- 图片怎样修改分辨率?用什么修改图片分辨率?
很多考试报名平台都会对图片分辨率有规定,但是我们图片很多都是72dpi的,不符合要求,需要先用修改图片分辨率工具去调整dpi,那么有没有比较简单的改图片分辨率(https://www.yasuotu. ...
- android 常见分辨率率,Android屏幕分辨率占有率分析及应用
Android屏幕分辨率各种各样,碎片化严重,开发者苦不堪言,转身看看iOS开发同学,只要适配2个尺寸的屏幕就好了,= =! 但我们总是能克服的对不,假如我们现在有这么一个需求: 我们将满屏显示一张网 ...
最新文章
- hadoop官方文档_hadoop体系简介
- ASP.NET MVC3 控制器
- gulp与webpack的区别
- 在Salesforce中调用外部系统所提供的的Web Service
- 蚂蚁金服CTO程立:做工程要有“拧螺丝”的精神
- 路由代码WebApi设置namespace路由参数
- Linux如何搭建Java部署环境
- java输入验证码代码,JavaWeb 实现验证码功能(demo)
- C++ 从入门到入土(English Version) Section 1:Gates, Circuits and Boolean Algebra
- jQuery插件开发精品教程,让你的jQuery提升一个台阶
- 想给视频去色并加马赛克就用它
- winhex 15.6 和 HexWorkshop 6.01注册机
- SCI/ISTP和EI论文检索号IDS number和收录号查询方法,详细使用教程和指南手册
- 神经网络之输出层设计
- java满天星星闪烁_满天星空的星星为什么闪烁?
- N32G430学习笔记1-工程模板建立
- opengl平行光与点光源和光线强弱的衰减
- 不同的国家/地区与语言缩写代码
- EOS 命令行创建账号及发币
- 莫队和带修莫队 学习笔记