圆形头像实现

ganshenml 2016-03-28 11:45:29

RectF rectF = new RectF(400, 400, 800, 800);
canvas.drawBitmap(backgroundBm, null, rectF, paint);
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));//paint要在canvas.draw前面 才有效果

canvas.drawRoundRect(rectF, 200, 200, paint);





为什么我画个圆形头像都这么。。。痛苦
...全文
666 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
头发还没秃a 2016-04-05
  • 打赏
  • 举报
回复
引用 17 楼 zhumj_zhumj 的回复:
[quote=引用 3 楼 ganshenml 的回复:] [quote=引用 1 楼 zhumj_zhumj 的回复:] 实现圆形外剪切
具体到我上面的代码缺省到了哪步?因为我自身感觉好像应该是这么做的就会有效果。[/quote] 自定义一个圆形ImageView控件吧。。。。http://download.csdn.net/detail/nuptboyzhb/7284553[/quote] 你如果非要自己画的话,你需要定义两层画布,一层画布用来把原图片画到Bitmap上面,一层画布画个圆形Bitmap,然后Paint设置setXfermode(),注意setXfermode这个属性很重要:

private Xfermode sXfermode1 = new PorterDuffXfermode(PorterDuff.Mode.DST_IN);//裁剪重合区域外面部分
private Xfermode sXfermode2 = new PorterDuffXfermode(PorterDuff.Mode.DST_OUT);//裁剪重合区域
头发还没秃a 2016-04-05
  • 打赏
  • 举报
回复
引用 3 楼 ganshenml 的回复:
[quote=引用 1 楼 zhumj_zhumj 的回复:] 实现圆形外剪切
具体到我上面的代码缺省到了哪步?因为我自身感觉好像应该是这么做的就会有效果。[/quote] 自定义一个圆形ImageView控件吧。。。。http://download.csdn.net/detail/nuptboyzhb/7284553
ganshenml 2016-04-01
  • 打赏
  • 举报
回复
引用 12 楼 xingzhong128 的回复:
Bitmap photo = BitmapFactory.decodeResource(getResources(), R.drawable.pic); Bitmap dst = Bitmap.createBitmap(300, 300, Bitmap.Config.ARGB_8888); // 定义dst图片 Bitmap src = dst.copy(Bitmap.Config.ARGB_8888, true); // 定义src图片 Bitmap b3 = dst.copy(Bitmap.Config.ARGB_8888, true); // 定义合成结果图片 Canvas canvas1 = new Canvas(dst); Canvas canvas2 = new Canvas(src); Canvas canvas3 = new Canvas(b3); Paint paint1 = new Paint(); Rect rect1 = new Rect(0, 0, photo.getWidth(), photo.getHeight()); Rect rect2 = new Rect(0, 0, 300, 300); canvas1.drawBitmap(photo, rect1, rect2, paint1); // 首先在dst图片上画上头像 Paint paint2 = new Paint(); paint2.setStrokeWidth(2); paint2.setStyle(Paint.Style.FILL); paint2.setColor(Color.RED); canvas2.drawCircle(150, 150, 150, paint2); // 在src图片上画上一个填充的圆 Paint paint = new Paint(); int layer = canvas3.saveLayer(0, 0, 300, 300, paint, Canvas.ALL_SAVE_FLAG); // 定义一个图层,同时也是定义了PorterDuff效果的Dst区域,如果没有用图层相当于没有定义Dst区域,那么PorterDuff效果就展现的有问题 canvas3.drawBitmap(dst, 0, 0, paint); // 绘制dst图片 paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN)); canvas3.drawBitmap(src, 0, 0, paint); // 绘制圆src图片 canvas3.restoreToCount(layer); //恢复图层到画布上 paint.setXfermode(null); // 重置画笔 canvas.drawBitmap(b3, 0, 0, paint); PorterDuff效果需要两幅Bitmap图片才能正确展示,lz可能是对这个效果的内涵没有理解清楚    canvas.drawRoundRect(rectF, 200, 200, paint); 这个方法画出的表面上是圆,实际上它是一个矩形,圆外面的地方还是属于长方形的。
感谢,我懂你的意思。我自己也实现了效果。有点疑问的是下面这个: 以下是自定义View:

import android.content.Context;
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.RectF;
import android.util.AttributeSet;
import android.widget.ImageView;

public class CircleView extends ImageView {
    Bitmap bitmap;
    Context context;

    public CircleView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public CircleView(Context context, Bitmap bitmap) {
        super(context);
        this.context = context;
        this.bitmap = bitmap;
    }

    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        Paint paint = new Paint();
        paint.setAntiAlias(true);
        paint.setColor(Color.RED);

        RectF rectF = new RectF(0, 0, 200, 200);
        canvas.drawRoundRect(rectF, 100, 100, paint);

        paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.SRC_IN));
        canvas.drawBitmap(bitmap, null, rectF, paint);

    }
}
然后是Activity中setContentView:

Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.logo_person);
CircleView circleView = new CircleView(this, bitmap);
setContentView(circleView);
出来的效果是正方形的图片,所以这点是有些疑问
乐逍遥二 2016-04-01
  • 打赏
  • 举报
回复
楼主你好,我是那个小女孩,我要收版权。。。
ganshenml 2016-03-31
  • 打赏
  • 举报
回复
引用 10 楼 assky124 的回复:

import android.content.Context;
import android.graphics.*;
import android.util.AttributeSet;
import android.widget.ImageView;

/**
 * 圆形图片
 * Created by Coder.Yan on 2015/11/10.
 */
public class CircleImageView extends ImageView {

    private Paint paint = null;
    private float cx = 0;
    private float cy = 0;
    private float radius = 0;
    private Path clipPath = null;

    public CircleImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
        paint = new Paint();
        paint.setAntiAlias(true);
        paint.setStyle(Paint.Style.STROKE);
        clipPath = new Path();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.save();
        canvas.clipPath(clipPath);
        super.onDraw(canvas);
        canvas.restore();
        paint.setColor(0xffffffff);
        canvas.drawCircle(cx,cy,radius,paint);
        paint.setColor(0xff808080);
        canvas.drawCircle(cx,cy,radius-1,paint);

    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int w = getMeasuredWidth() - getPaddingLeft() - getPaddingRight();
        int h = getMeasuredHeight() - getPaddingTop() - getPaddingBottom();
        int r = Math.min(w,h)/2;
        cx = getPaddingLeft() + r;
        cy = getPaddingTop() + r;
        radius = r;
        clipPath.reset();
        clipPath.addCircle(cx,cy,r, Path.Direction.CW);
    }
}
我写的圆形图片控件,参考下
谢谢!
怀君 2016-03-31
  • 打赏
  • 举报
回复
http://download.csdn.net/detail/u013290250/9425955 直接用。
xingzhong128 2016-03-31
  • 打赏
  • 举报
回复
如果想实现的简单点可以用clippath,这样就只会在path指定的位置绘图,所以为了不影响后面的绘图就需要对canvas保存和恢复 canvas.save(); Path path = new Path(); path.addCircle(300, 300, 200, Path.Direction.CCW); canvas.clipPath(path); RectF rectF = new RectF(100, 100, 500, 500); canvas.drawBitmap(photo, null, rectF, paint); canvas.restore();
xingzhong128 2016-03-31
  • 打赏
  • 举报
回复
Bitmap photo = BitmapFactory.decodeResource(getResources(), R.drawable.pic);

Bitmap dst = Bitmap.createBitmap(300, 300, Bitmap.Config.ARGB_8888); // 定义dst图片
Bitmap src = dst.copy(Bitmap.Config.ARGB_8888, true); // 定义src图片
Bitmap b3 = dst.copy(Bitmap.Config.ARGB_8888, true); // 定义合成结果图片

Canvas canvas1 = new Canvas(dst);
Canvas canvas2 = new Canvas(src);
Canvas canvas3 = new Canvas(b3);

Paint paint1 = new Paint();
Rect rect1 = new Rect(0, 0, photo.getWidth(), photo.getHeight());
Rect rect2 = new Rect(0, 0, 300, 300);
canvas1.drawBitmap(photo, rect1, rect2, paint1); // 首先在dst图片上画上头像

Paint paint2 = new Paint();
paint2.setStrokeWidth(2);
paint2.setStyle(Paint.Style.FILL);
paint2.setColor(Color.RED);
canvas2.drawCircle(150, 150, 150, paint2); // 在src图片上画上一个填充的圆

Paint paint = new Paint();
int layer = canvas3.saveLayer(0, 0, 300, 300, paint, Canvas.ALL_SAVE_FLAG); // 定义一个图层,同时也是定义了PorterDuff效果的Dst区域,如果没有用图层相当于没有定义Dst区域,那么PorterDuff效果就展现的有问题
canvas3.drawBitmap(dst, 0, 0, paint); // 绘制dst图片
paint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_IN));
canvas3.drawBitmap(src, 0, 0, paint); // 绘制圆src图片
canvas3.restoreToCount(layer); //恢复图层到画布上

paint.setXfermode(null); // 重置画笔
canvas.drawBitmap(b3, 0, 0, paint);
PorterDuff效果需要两幅Bitmap图片才能正确展示,lz可能是对这个效果的内涵没有理解清楚



   canvas.drawRoundRect(rectF, 200, 200, paint); 这个方法画出的表面上是圆,实际上它是一个矩形,圆外面的地方还是属于长方形的。
assky124 2016-03-30
  • 打赏
  • 举报
回复

import android.content.Context;
import android.graphics.*;
import android.util.AttributeSet;
import android.widget.ImageView;

/**
 * 圆形图片
 * Created by Coder.Yan on 2015/11/10.
 */
public class CircleImageView extends ImageView {

    private Paint paint = null;
    private float cx = 0;
    private float cy = 0;
    private float radius = 0;
    private Path clipPath = null;

    public CircleImageView(Context context, AttributeSet attrs) {
        super(context, attrs);
        paint = new Paint();
        paint.setAntiAlias(true);
        paint.setStyle(Paint.Style.STROKE);
        clipPath = new Path();
    }

    @Override
    protected void onDraw(Canvas canvas) {
        canvas.save();
        canvas.clipPath(clipPath);
        super.onDraw(canvas);
        canvas.restore();
        paint.setColor(0xffffffff);
        canvas.drawCircle(cx,cy,radius,paint);
        paint.setColor(0xff808080);
        canvas.drawCircle(cx,cy,radius-1,paint);

    }

    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        int w = getMeasuredWidth() - getPaddingLeft() - getPaddingRight();
        int h = getMeasuredHeight() - getPaddingTop() - getPaddingBottom();
        int r = Math.min(w,h)/2;
        cx = getPaddingLeft() + r;
        cy = getPaddingTop() + r;
        radius = r;
        clipPath.reset();
        clipPath.addCircle(cx,cy,r, Path.Direction.CW);
    }
}
我写的圆形图片控件,参考下
ESC尛蜜蜂 2016-03-29
  • 打赏
  • 举报
回复
/**
	 * 
	 * @param bitmap
	 * @return Bitmap 把图片转化为圆形
	 * 
	 */
	public static Bitmap toRoundBitmap(Bitmap bitmap) {
		int width = bitmap.getWidth();
		int height = bitmap.getHeight();
		float roundPx;
		float left, top, right, bottom, dst_left, dst_top, dst_right, dst_bottom;

		if (width <= height) {
			roundPx = width / 2;
			top = 0;
			bottom = width;
			left = 0;
			right = width;
			height = width;
			dst_left = 0;
			dst_top = 0;
			dst_right = width;
			dst_bottom = width;
		}

		else {
			roundPx = height / 2;
			float clip = (width - height) / 2;
			left = clip;
			right = width - clip;
			top = 0;
			bottom = height;
			width = height;
			dst_left = 0;
			dst_top = 0;
			dst_right = height;
			dst_bottom = height;
		}

		Bitmap output = Bitmap.createBitmap(width, height, Config.ARGB_8888);
		Canvas canvas = new Canvas(output);

		final int color = 0xff424242;
		final Paint paint = new Paint();
		final Rect src = new Rect((int) left, (int) top, (int) right,
				(int) bottom);
		final Rect dst = new Rect((int) dst_left, (int) dst_top,
				(int) dst_right, (int) dst_bottom);
		final RectF rectF = new RectF(dst);

		paint.setAntiAlias(true);

		canvas.drawARGB(0, 0, 0, 0);
		paint.setColor(color);
		canvas.drawRoundRect(rectF, roundPx, roundPx, paint);

		paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
		canvas.drawBitmap(bitmap, src, dst, paint);
		return output;
	}
我现在用的图片工具类
程序员悟空 2016-03-29
  • 打赏
  • 举报
回复
头发还没秃a 2016-03-29
  • 打赏
  • 举报
回复
引用 1 楼 zhumj_zhumj 的回复:
实现圆形外剪切
http://blog.csdn.net/hellochenlian/article/details/38512561这应该是你需要的
ganshenml 2016-03-29
  • 打赏
  • 举报
回复
引用 1 楼 zhumj_zhumj 的回复:
实现圆形外剪切
具体到我上面的代码缺省到了哪步?因为我自身感觉好像应该是这么做的就会有效果。
头发还没秃a 2016-03-29
  • 打赏
  • 举报
回复
实现圆形外剪切
ganshenml 2016-03-29
  • 打赏
  • 举报
回复
引用 4 楼 a511341250 的回复:
/**
	 * 
	 * @param bitmap
	 * @return Bitmap 把图片转化为圆形
	 * 
	 */
	public static Bitmap toRoundBitmap(Bitmap bitmap) {
		int width = bitmap.getWidth();
		int height = bitmap.getHeight();
		float roundPx;
		float left, top, right, bottom, dst_left, dst_top, dst_right, dst_bottom;

		if (width <= height) {
			roundPx = width / 2;
			top = 0;
			bottom = width;
			left = 0;
			right = width;
			height = width;
			dst_left = 0;
			dst_top = 0;
			dst_right = width;
			dst_bottom = width;
		}

		else {
			roundPx = height / 2;
			float clip = (width - height) / 2;
			left = clip;
			right = width - clip;
			top = 0;
			bottom = height;
			width = height;
			dst_left = 0;
			dst_top = 0;
			dst_right = height;
			dst_bottom = height;
		}

		Bitmap output = Bitmap.createBitmap(width, height, Config.ARGB_8888);
		Canvas canvas = new Canvas(output);

		final int color = 0xff424242;
		final Paint paint = new Paint();
		final Rect src = new Rect((int) left, (int) top, (int) right,
				(int) bottom);
		final Rect dst = new Rect((int) dst_left, (int) dst_top,
				(int) dst_right, (int) dst_bottom);
		final RectF rectF = new RectF(dst);

		paint.setAntiAlias(true);

		canvas.drawARGB(0, 0, 0, 0);
		paint.setColor(color);
		canvas.drawRoundRect(rectF, roundPx, roundPx, paint);

		paint.setXfermode(new PorterDuffXfermode(Mode.SRC_IN));
		canvas.drawBitmap(bitmap, src, dst, paint);
		return output;
	}
我现在用的图片工具类
感谢,这段代码我在网上查到过很多次。我的那种实现方式也是其中一种的,但是照理说应该是可以正常画出来的,但是不知道是哪里的问题,效果硬是没有出来。
ganshenml 2016-03-29
  • 打赏
  • 举报
回复
引用 6 楼 littlebrain4solving 的回复:
凡是和图片有关的都能采用fresco,它都帮你做了优化和释放的工作了。
额,感谢,恩,网上有些开源库是可以直接用的,但我发这个问题其实就想问,我上面贴的代码实现思路应该是没有错的,但是为什么就画不出来。
  • 打赏
  • 举报
回复
凡是和图片有关的都能采用fresco,它都帮你做了优化和释放的工作了。
  • 打赏
  • 举报
回复
想实现功能不用那么复杂,使用Facebook fresco.
内容概要:本文提出了一种基于改进扩散模型的高海拔地区新能源高波动出力场景生成方法,并提供了完整的Python代码实现。该方法针对高海拔地区风能、光伏等新能源出力波动剧烈、不确定性高的特点,通过优化扩散模型的结构与训练策略,有效捕捉历史数据的概率分布特征与时序相关性,从而生成高质量、多样化的出力场景。文中详细阐述了模型的数学推导、网络架构设计、损失函数优化及采样算法改进,并通过实验证明其在拟合精度、场景多样性与稳定性方面优于传统生成模型,为电力系统在高比例新能源接入下的规划、调度与风险评估提供了可靠的场景输入支持。; 适合人群:具备一定Python编程能力和机器学习基础,从事新能源发电预测、电力系统分析、智能优化、场景生成等方向研究的科研人员、高校研究生及工程技术人员。; 使用场景及目标:①用于高海拔地区风电、光伏出力的不确定性建模与多场景生成;②支撑含高渗透率新能源的电力系统随机优化调度、鲁棒决策与风险评估;③为相关学术研究、论文复现与算法改进提供可运行的技术方案与代码基础; 阅读建议:建议读者结合所提供的完整资源(代码、数据集、说明文档)进行实践操作,重点关注扩散模型的前向加噪与反向去噪过程的设计细节,以及如何将其适配于新能源时序数据的生成任务,通过参数调优与对比实验深入理解模型的生成机制与性能边界。
内容概要:本文围绕基于静态约束法的配电网电动汽车接入容量评估展开研究,提出了一种在新型电力系统背景下评估主动配电网对电动汽车承载能力的方法。研究通过构建数学模型,结合潮流计算与关键约束条件(如电压越限、线路过载等),量化分析配电网可承受的最大电动汽车充电负荷容量,旨在识别规模化电动汽车接入带来的潜在运行风险,并为电网规划与运行提供科学依据。文中配套提供了完整的Matlab代码实现,便于仿真验证与结果复现。此外,该研究与分布式光伏承载力评估、电动汽车可调能力分析等方向形成技术联动,展现了多主题协同的研究体系。; 适合人群:具备电力系统分析基础理论知识及Matlab编程能力的高校研究生、科研机构研究人员,以及从事新能源并网、智能配电网规划与运行等相关领域的工程技术人员。; 使用场景及目标:①用于学术研究中的模型复现与论文撰写支撑;②评估实际配电网中电动汽车大规模接入的可行性与安全边界,指导充电基础设施布局;③作为高校教学案例,帮助学生深入理解电网承载力评估的核心原理、建模方法与仿真技术; 阅读建议:建议结合文中提及的相关研究方向(如二阶锥规划、多面体聚合方法等)进行对比学习,充分利用所提供的Matlab代码与网盘资料开展仿真实验,重点关注约束条件的设定逻辑与潮流计算模块的实现细节,以深化对评估模型机理与工程应用价值的理解。
内容概要:本文围绕“考虑隐私保护的分布式联邦学习电力负荷预测研究”展开,提出了一种基于Python实现的联邦学习框架,旨在解决居民或行业电力负荷预测中用户电表数据隐私泄露的风险。该研究通过构建分布式机器学习模型,使各参与方在不共享原始数据的前提下协同训练全局模型,有效实现了数据“可用不可见”。文中详细阐述了联邦学习的整体架构设计、本地模型训练流程、参数加密传输与安全聚合机制,并结合差分隐私等技术进一步增强系统的隐私保护能力。同时,研究利用真实电力负荷数据集进行了实验验证,展示了方法在预测精度与隐私保障之间的良好平衡,并提供了完整的代码实例与复现指南,便于后续研究与应用拓展。; 适合人群:具备一定机器学习基础和电力系统背景知识,从事智慧能源、隐私计算或人工智能相关方向研究的研究生、科研人员及工程技术人员。; 使用场景及目标:① 实现跨区域、跨主体的电力负荷协同预测,打破数据孤岛;② 在确保用户用电数据隐私安全的前提下提升负荷预测准确性;③ 推动联邦学习在智能电网、需求响应、虚拟电厂等场景中的实际部署与应用。; 阅读建议:建议结合文中提供的Python代码与网盘资料进行动手实践,重点关注联邦学习的通信轮次设计、模型聚合算法(如FedAvg)的实现细节以及差分隐私噪声添加策略,深入理解其对模型性能与隐私强度的影响,为进一步优化与创新奠定基础。
VDA_Band_19.1_3rd edition_2026 English Inspection of Technical Cleanliness 内容概要:本文档为德国汽车工业协会(VDA)发布的第三版《技术清洁度检验:功能相关汽车部件的颗粒污染检测》(VDA 19.1),系统规范了汽车行业中零部件技术清洁度的检测方法与流程。文件涵盖从取样、提取、过滤到分析的全流程标准化操作,重点更新了干法提取(如 Stamp Test 和刷吸法)、小于50µm颗粒的检测、光学子系统和SEM/EDX标准分析方法,并引入统一材料分类体系以提升结果可比性。同时明确了“标准分析”与“自由检验”的区别,前者用于高兼容性检测,后者允许客户与供应商协商定制参数。文档还强化了对非可测组件的技术清洁保障、测量不确定度评估及方法验证的要求,并提供了多个实际案例支持应用落地。; 适合人群:适用于汽车制造业中从事质量控制、工艺开发、供应商管理及相关检测实验室的技术人员和管理人员,尤其适合具备一定质量管理或洁净度检测基础的专业人员。; 使用场景及目标:①用于制定和执行零部件清洁度检测标准;②指导 incoming/outgoing 检验及生产过程监控;③支持失效分析与质量改进项目;④作为企业内部审核和技术交流的依据; 阅读建议:建议结合VDA 19.2及其他相关标准配套使用,重点关注各章节中的起始参数设定、方法选择逻辑及附录中的检查表示例,在实际操作中同步开展方法验证与人员培训,确保检测结果的有效性和可追溯性。

80,489

社区成员

发帖
与我相关
我的任务
社区描述
移动平台 Android
androidandroid-studioandroidx 技术论坛(原bbs)
社区管理员
  • Android
  • yechaoa
  • 失落夏天
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧