当前位置:首页 » 安卓系统 » androidbitmap圆形

androidbitmap圆形

发布时间: 2023-02-18 07:45:01

⑴ Android 控件 RoundedBitmapDrawable

RoundedBitmapDrawable 是 supportV4 下的一个类,有了它,显示圆角和圆形图片的情况下就不需要额外的第三方类库了,还能和各种图片加载库配合使用。
点击此处 可以看到官方的介绍。

setCircular(boolean circular) : 把图片的形状设为圆形;

setCornerRadius(float cornerRadius) : 设置图片的圆角半径。

这里贴一下源码,更能清晰的知道它的实现:

至于具体的实现,阅读源码发现官方使用了 BitmapShader 来实现的圆角。

效果

首先来看下原图和处理后效果,以及做一些扩展,如添加一个边框

通过 RoundedBitmapDrawableFactory 传递要转换bitmap 我就可以很简单的生成一个如下图的圆角图片

可以看到我们仅仅只是改了一个属性就实现了如下图正圆形的转换,但你可能已经发现图像有一些变形,因为内部在接收到 circular == true 后先是对图像进行了转换为正方形的操作,这个操作是一个伸缩放操作,而不是裁剪,所以图像发生了变形,所以在使用 setCircular 时最好能保证你的原图时一个正方形的,如果不是的话,下面我们也会给出相应解决方案

我们自己进行对bitmap的裁剪来转换成正方形,就解决了上面提到的拉伸问题,再绘制边框就实现了一个如下带边框的正圆形图片

RoundedBitmapDrawable 也可以直接设置转换过程的

这些操作,来更好的工作

到这个里我们就可以把项目中的圆角图片的控件更换一下,平时记得多留意一下系统提供的一些API,可能会帮我们节省不少时间。

引用:
★★★ Android一些容易被忽略的类-RoundedBitmapDrawable
★★ Android 必知必会-使用 supportV4 的 RoundedBitmapDrawable 实现圆角

⑵ Android Bitmap详解

Bitmap是Android系统中图像处理的最重要类之一。用它可以获取图像信息,对图像进行剪切、旋转、缩放等操作,并可以指定格式保存图像文件。

以in开头的都是设置属性值,以out开头的都是获取属性值。

Bitmap的加载获取方式主要有有从Resource资源加载、本地SD卡加载及网络加载等方式。

使用BitmapFactory.decodeResource方式加载图片如果要经过缩放,该缩放是在java层进行的,效率比较低,会消耗java层的内存,因此如果大量使用会导致OOM。

BitmapFactory.decodeStream一般用于二进制文件图片的读取。

从网络加载图片本质上也是从网络读取图片数据流,通过BitmapFactory.decodeStream方式加载图片。

其他的转换就不一一列举了,不能直接转换的可以间接进行转换。

在拍照上传图片过程中,我们可能会遇到上传的图片被旋转了,需要给他复原进行旋转。

获取图片的旋转角度:

⑶ Android中怎么把一张bitmap图在外围加上一个圈

你可以去研究下canvas,和paint这两个类,这里只给出思路。

  1. new一个空白的bitmap对象

  2. 裁剪你需要显示的图片,使之为符合要求的园

  3. 画到空白的bitmap对象上

  4. 再画外围的圈

  5. set到imageview里面进行显示

⑷ android xml圆型头像怎么办

android生成圆形头像
public static Bitmap getRoundedCornerBitmap(Bitmap bitmap) {

Bitmap output = Bitmap.createBitmap(bitmap.getWidth(), bitmap.getHeight(), Config.ARGB_8888);
Canvas canvas = new Canvas(output);

final Paint paint = new Paint();
//保证是方形,并且从中心画
int width = bitmap.getWidth();
int height = bitmap.getHeight();
int w;
int deltaX = 0;
int deltaY = 0;
if (width <= height) {
w = width;
deltaY = height - w;
} else {
w = height;
deltaX = width - w;
}
final Rect rect = new Rect(deltaX, deltaY, w, w);
final RectF rectF = new RectF(rect);

paint.setAntiAlias(true);
canvas.drawARGB(0, 0, 0, 0);
//圆形,所有只用一个

int radius = (int) (Math.sqrt(w * w * 2.0d) / 2);
canvas.drawRoundRect(rectF, radius, radius, paint);

paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
canvas.drawBitmap(bitmap, rect, rect, paint);
return output;
}

⑸ android 如何把正方形图片显示圆形

Android应用开发中,很多头像都要求显示成圆形的,这就可以使用android的canvas、paint这些类来进行设置圆形,先设置paint的样式为圆形,然后把你要设置成圆形的图片重新赋值给paint这个类:canvas.drawBitmap(tempBmp, rect, rect, paint);

核心代码如下(引用这位前辈:http://blog.sina.com.cn/s/blog_7607703f0101dhlj.html,我增加一些注释,原来是没有注释):

packagecom.liang.round;
importandroid.annotation.SuppressLint;
importandroid.content.Context;
importandroid.graphics.Bitmap;
importandroid.graphics.Bitmap.Config;
importandroid.graphics.BitmapFactory;
importandroid.graphics.Canvas;
importandroid.graphics.Paint;
importandroid.graphics.PorterDuff;
importandroid.graphics.PorterDuffXfermode;
importandroid.graphics.Rect;
importandroid.view.View;
publicclassMyViewextendsView{
privateBitmapbmp=null;
privatePaintpaint=null;
publicMyView(Contextcontext){
super(context);
//TODOAuto-generatedconstructorstub
paint=newPaint();//实例化画笔类
BitmapFactory.Optionsoptions=newBitmapFactory.Options();
options.inJustDecodeBounds=true;
BitmapFactory.decodeResource(context.getResources(),R.drawable.test,options);//获得你存放在drawable下的正方形图片
options.inJustDecodeBounds=false;
BitmaptempBmp=BitmapFactory.decodeResource(context.getResources(),R.drawable.test,options);//实例化一个bitmap图片类
intwidth=options.outWidth;
intheight=options.outHeight;
intsize=width>height?height:width;//边框
intpos=(int)(size/2);
doubleradius=pos*Math.sin(45*180/Math.PI);//半径
size=(int)(radius*2);
pos=(int)(size/2);
bmp=Bitmap.createBitmap(size,size,Config.ARGB_8888);
Canvascanvas=newCanvas(bmp);
Rectrect=newRect(0,0,size,size);
paint.setAntiAlias(true);
canvas.drawCircle(pos,pos,(float)radius,paint);
paint.setXfermode(newPorterDuffXfermode(PorterDuff.Mode.SRC_ATOP));
canvas.drawBitmap(tempBmp,rect,rect,paint);
tempBmp.recycle();
}
@SuppressLint("DrawAllocation")
@Override
protectedvoidonDraw(Canvascanvas){
//TODOAuto-generatedmethodstub
super.onDraw(canvas);
if(bmp!=null){
if(!bmp.isRecycled()){
canvas.drawBitmap(bmp,100,100,paint);
}
}
}
}

⑹ bitmap android怎么按圆弧剪切

按圆弧剪切,可以用Photoshop。

  1. 打开需要裁剪成圆形的图片。

  2. 右键单击工具栏第一格,左键单击选择“椭圆选框工具”。

  3. 按住鼠标左键和键盘上的Shift键,同时拖动鼠标,选中需要留下的圆形部分。(注:如果要裁剪成椭圆形,则不需要按住Shift键。)

  4. 单击“选择”——“反向”。

  5. 不需要的部分被选中。

  6. 按键盘上的Del键,删除不需要的部分。

  7. 单击“选择”——“反向”,选中需要留下的圆形部分。

  8. 单击“编辑”——“剪切”。

  9. 单击“新建”,背景内容选择“透明”,然后单击“确定”。

  10. 单击“编辑”——“粘贴”,图片就裁剪好了。之后只要单击“文件”——“存储”,就可以保存图片了。

⑺ android swiperefreshlayout 为什么是圆形的

其实主要靠:paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));这行代码,为什么呢,我给大家解释下,SRC_IN这种模式,两个绘制的效果叠加后取交集展现后图,怎么说呢,咱们第一个绘制的是个圆形,第二个绘制的是个Bitmap,于是交集为圆形,展现的是BItmap,就实现了圆形图片效果。圆角,其实就是先绘制圆角矩形,是不是很简单,以后别人再说实现圆角,你就把这一行代码给他就行了。

从Android的示例中,给大家证明一下:
下面有一张PorterDuff.Mode的16中效果图,咱们的只是其一:

源码咱们只关心谁先谁后绘制的:

[java] view plain
canvas.translate(x, y);
canvas.drawBitmap(mDstB, 0, 0, paint);
paint.setXfermode(sModes[i]);
canvas.drawBitmap(mSrcB, 0, 0, paint);
paint.setXfermode(null);
canvas.restoreToCount(sc);
可以看出先绘制的Dst,再绘制的Src,最后的展示是SrcIn那个图:显示的区域是二者交集,展示的是Src(后者)。和咱们前面结论一致。效果16种,大家可以自由组合展示不同的效果。

好了,原理和核心代码解释完成。下面开始写自定义View。
1、自定义属性:

[html] view plain
<?xml version="1.0" encoding="utf-8"?>
<resources>

<attr name="borderRadius" format="dimension" />
<attr name="type">
<enum name="circle" value="0" />
<enum name="round" value="1" />
</attr>
<attr name="src" format="reference"></attr>

<declare-styleable name="CustomImageView">
<attr name="borderRadius" />
<attr name="type" />
<attr name="src" />
</declare-styleable>

</resources>

2、构造中获取自定义的属性:

[java] view plain
/**
* TYPE_CIRCLE / TYPE_ROUND
*/
private int type;
private static final int TYPE_CIRCLE = 0;
private static final int TYPE_ROUND = 1;

/**
* 图片
*/
private Bitmap mSrc;

/**
* 圆角的大小
*/
private int mRadius;

/**
* 控件的宽度
*/
private int mWidth;
/**
* 控件的高度
*/
private int mHeight;

public CustomImageView(Context context, AttributeSet attrs)
{
this(context, attrs, 0);
}

public CustomImageView(Context context)
{
this(context, null);
}

/**
* 初始化一些自定义的参数
*
* @param context
* @param attrs
* @param defStyle
*/
public CustomImageView(Context context, AttributeSet attrs, int defStyle)
{
super(context, attrs, defStyle);

TypedArray a = context.getTheme().obtainStyledAttributes(attrs, R.styleable.CustomImageView, defStyle, 0);

int n = a.getIndexCount();
for (int i = 0; i < n; i++)
{
int attr = a.getIndex(i);
switch (attr)
{
case R.styleable.CustomImageView_src:
mSrc = BitmapFactory.decodeResource(getResources(), a.getResourceId(attr, 0));
break;
case R.styleable.CustomImageView_type:
type = a.getInt(attr, 0);// 默认为Circle
break;
case R.styleable.CustomImageView_borderRadius:
mRadius= a.getDimensionPixelSize(attr, (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 10f,
getResources().getDisplayMetrics()));// 默认为10DP
break;
}
}
a.recycle();
}

3、onMeasure中获取控件宽高:

[java] view plain
/**
* 计算控件的高度和宽度
*/
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec)
{
// super.onMeasure(widthMeasureSpec, heightMeasureSpec);
/**
* 设置宽度
*/
int specMode = MeasureSpec.getMode(widthMeasureSpec);
int specSize = MeasureSpec.getSize(widthMeasureSpec);

if (specMode == MeasureSpec.EXACTLY)// match_parent , accurate
{
mWidth = specSize;
} else
{
// 由图片决定的宽
int desireByImg = getPaddingLeft() + getPaddingRight()
+ mSrc.getWidth();
if (specMode == MeasureSpec.AT_MOST)// wrap_content
{
mWidth = Math.min(desireByImg, specSize);
} else

mWidth = desireByImg;
}

/***
* 设置高度
*/

specMode = MeasureSpec.getMode(heightMeasureSpec);
specSize = MeasureSpec.getSize(heightMeasureSpec);
if (specMode == MeasureSpec.EXACTLY)// match_parent , accurate
{
mHeight = specSize;
} else
{
int desire = getPaddingTop() + getPaddingBottom()
+ mSrc.getHeight();

if (specMode == MeasureSpec.AT_MOST)// wrap_content
{
mHeight = Math.min(desire, specSize);
} else
mHeight = desire;
}

setMeasuredDimension(mWidth, mHeight);

}

4、根据Type绘制:

[java] view plain
/**
* 绘制
*/
@Override
protected void onDraw(Canvas canvas)
{

switch (type)
{
// 如果是TYPE_CIRCLE绘制圆形
case TYPE_CIRCLE:

int min = Math.min(mWidth, mHeight);
/**
* 长度如果不一致,按小的值进行压缩
*/
mSrc = Bitmap.createScaledBitmap(mSrc, min, min, false);

canvas.drawBitmap(createCircleImage(mSrc, min), 0, 0, null);
break;
case TYPE_ROUND:
canvas.drawBitmap(createRoundConerImage(mSrc), 0, 0, null);
break;

}

}

/**
* 根据原图和变长绘制圆形图片
*
* @param source
* @param min
* @return
*/
private Bitmap createCircleImage(Bitmap source, int min)
{
final Paint paint = new Paint();
paint.setAntiAlias(true);
Bitmap target = Bitmap.createBitmap(min, min, Config.ARGB_8888);
/**
* 产生一个同样大小的画布
*/
Canvas canvas = new Canvas(target);
/**
* 首先绘制圆形
*/
canvas.drawCircle(min / 2, min / 2, min / 2, paint);
/**
* 使用SRC_IN,参考上面的说明
*/
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
/**
* 绘制图片
*/
canvas.drawBitmap(source, 0, 0, paint);
return target;
}

/**
* 根据原图添加圆角
*
* @param source
* @return
*/
private Bitmap createRoundConerImage(Bitmap source)
{
final Paint paint = new Paint();
paint.setAntiAlias(true);
Bitmap target = Bitmap.createBitmap(mWidth, mHeight, Config.ARGB_8888);
Canvas canvas = new Canvas(target);
RectF rect = new RectF(0, 0, source.getWidth(), source.getHeight());
canvas.drawRoundRect(rect, mRadius, mRadius, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
canvas.drawBitmap(source, 0, 0, paint);
return target;
}

好了,我就不解析代码了,自定义View这是第五篇了,,,,写得好恶心,,,,

⑻ android 能在bitmap上绘制圆吗

能,这是往图片(图片转为Bitmap)上写入文字、图片,你换成画圆就是得了。
/**
* 往图片上写入文字、图片等内容
*/
private void drawNewBitmap(String str) {
Bitmap photo = BitmapFactory.decodeResource(this.getResources(),R.drawable.introce_first);

int width = photo.getWidth();
int hight = photo.getHeight();

Bitmap bitmap = Bitmap.createBitmap(width, hight, Bitmap.Config.ARGB_8888); // 建立一个空的BItMap
Canvas canvas = new Canvas(bitmap);// 初始化画布绘制的图像到icon上

Paint photoPaint = new Paint(); // 建立画笔
photoPaint.setDither(true); // 获取跟清晰的图像采样
photoPaint.setFilterBitmap(true);// 过滤一些

Rect src = new Rect(0, 0, photo.getWidth(), photo.getHeight());// 创建一个指定的新矩形的坐标
Rect dst = new Rect(0, 0, width, hight);// 创建一个指定的新矩形的坐标
canvas.drawBitmap(photo, src, dst, photoPaint);// 将photo 缩放或则扩大到
// dst使用的填充区photoPaint

Paint textPaint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.DEV_KERN_TEXT_FLAG);// 设置画笔
textPaint.setTextSize(30.0f);// 字体大小
textPaint.setTypeface(Typeface.DEFAULT_BOLD);// 采用默认的宽度
textPaint.setColor(Color.BLACK);// 采用的颜色
canvas.drawText(str, 200, 200, textPaint);// 绘制上去字,开始未知x,y采用那只笔绘制
canvas.drawBitmap(BitmapFactory.decodeResource(this.getResources(),R.drawable.ic_launcher), 100, 100, textPaint);
canvas.save(Canvas.ALL_SAVE_FLAG);
canvas.restore();
iv.setBackgroundDrawable(new BitmapDrawable(this.getResources(), bitmap));
saveMyBitmap(bitmap,"test1");
}

⑼ android中 怎么显示一直图片为圆形图片

android中的imageview只能显示矩形的图片,这样一来不能满足我们其他的需求,比如要显示圆形的图片,这个时候,我们就需要自定义imageview了,其原理就是首先获取到图片的bitmap,然后进行裁剪圆形的bitmap,然后在ondraw()进行绘制圆形图片输出。

⑽ Android Bitmap理解

参考:
Android Bitmap 详解:关于 Bitamp 你所要知道的一切

Android Bitmap(位图)详解

图片是由大量且有限个数的像素点组成。把一张图片通过bitmap的方式创建到内存中,实际上就是在内存中创建了一个叫做Bitmap的对象,然后把 图片所有像素 解码后的数据存放在Bitmap对象里面,Bitmap就拥有了图片的宽高,透明度,颜色值等数据。所以Bitmap的创建是通过BitmapFactory.decodeXxx()。

Config是Bitmap类中的枚举类。像素由ARGB四个颜色通道组成。Config描述位图中像素的存储方式。 这里的存储方式,无非就是对颜色通道和用多大的容器(bit)来存储的排列组合。所以config会影响图片透明度,占用内存大小,保存成文件的大小,图片质量。
Config的字母表示该配置存储的像素的颜色通道,数字表示对应通道的数据用多少位来存储。

ALPHA_8:表示只存储alpha通道,使用8bit(1字节)的内存(容器)来存储一个像素。
RGB_565:表示存储RGB三个通道,分别使用5bit,6bit,5bit的内存(容器)来存储一个像素。
ARGB_4444:表示存储ARGB四个通道,每个通道都是以4bit的内存(容器)来存储一个像素。
ARGB_8888:表示存储ARGB四个通道,每个通道都是以8bit的内存(容器)来存储一个像素。

所以,ARGB_8888配置占用内存最大,图片质量最高。
图片压缩的一个思路就是降低图片的配置。

总内存 = 宽的像素数 × 高的像素数 × 每个像素点占用的大小
注:
1 byte = 8 bit
1 KB = 1024 byte

热点内容
码尚编程 发布:2025-05-16 15:55:39 浏览:444
android全局字体 发布:2025-05-16 15:53:19 浏览:572
jsp在服务器编译先转译成什么 发布:2025-05-16 15:41:36 浏览:981
svn服务器编译 发布:2025-05-16 15:41:26 浏览:965
照片被涂鸦擦掉如何看到信息安卓 发布:2025-05-16 15:36:43 浏览:179
手机怎么配置内存大 发布:2025-05-16 15:18:06 浏览:166
xpshop源码 发布:2025-05-16 15:17:25 浏览:404
android弹出通知 发布:2025-05-16 14:59:20 浏览:511
数据库EST 发布:2025-05-16 14:59:15 浏览:198
android版本号修改 发布:2025-05-16 14:53:48 浏览:174