Android 图片添加白边(类似加框)
来源:互联网 发布:js 数组是否包含字符串 编辑:程序博客网 时间:2024/05/17 03:45
最近项目中碰到 网页中的二维码长按保存图片,把保存下来的二维码图片发送到聊天消息中,长按点击识别不了二维码图片(ps:高端手机能轻易识别,低段手机就识别不了)。
由于是全屏显示的,识别不了二维码的界线,就判断不了是否是二维码(PS:自己的理解,勿喷)。要想让二维码识别出来,简单就是在该二维码四周添加白边,就能识别了。有人可能认为干嘛生成二维码是后不直接连白边一起生成呢,主要是web生成时偷懒,so…你懂的
下面就给出解决法,上代码:
/** * * 设置bitmap四周白边 * * @param bitmap 原图 * @return */ public static Bitmap bg2WhiteBitmap(Bitmap bitmap) { int size = bitmap.getWidth() < bitmap.getHeight() ? bitmap.getWidth() : bitmap.getHeight(); int num = 14; int sizebig = size + num; // 背图 Bitmap newBitmap = Bitmap.createBitmap(sizebig, sizebig, Config.ARGB_8888); Canvas canvas = new Canvas(newBitmap); Paint paint = new Paint(); paint.setAntiAlias(true); canvas.drawARGB(0, 0, 0, 0); // 生成白色的 paint.setColor(Color.WHITE); canvas.drawBitmap(bitmap, num / 2, num / 2, paint); paint.setXfermode(new PorterDuffXfermode(Mode.DST_ATOP)); // 画正方形的 canvas.drawRect(0, 0, sizebig, sizebig, paint); return newBitmap; }
我是直接在网页上,执行长按图片操作时进行添加白边后保存图片,问题就解决了。
这要看二维码界线是不是很明显了。
下面介绍点Canvas相关知识点:
Paint类常用方法:
setARGB(int a, int r, int g, int b) // 设置 Paint对象颜色,参数一为alpha透明值
setAlpha(int a) // 设置alpha不透明度,范围为0~255
setAntiAlias(boolean aa) // 是否抗锯齿
setColor(int color) // 设置颜色,这里Android内部定义的有Color类包含了一些常见颜色定义
setTextScaleX(float scaleX) // 设置文本缩放倍数,1.0f为原始
setTextSize(float textSize) // 设置字体大小
setUnderlineText(booleanunderlineText) // 设置下划线
public class DrawView extends View { public DrawView(Context context) { super(context); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); /* * 方法 说明 drawRect 绘制矩形 drawCircle 绘制圆形 drawOval 绘制椭圆 drawPath 绘制任意多边形 * drawLine 绘制直线 drawPoin 绘制点 */ // 创建画笔 Paint p = new Paint(); p.setColor(Color.RED);// 设置红色 canvas.drawText("画圆:", 10, 20, p);// 画文本 canvas.drawCircle(60, 20, 10, p);// 小圆 p.setAntiAlias(true);// 设置画笔的锯齿效果。 true是去除,大家一看效果就明白了 canvas.drawCircle(120, 20, 20, p);// 大圆 canvas.drawText("画线及弧线:", 10, 60, p); p.setColor(Color.GREEN);// 设置绿色 canvas.drawLine(60, 40, 100, 40, p);// 画线 canvas.drawLine(110, 40, 190, 80, p);// 斜线 //画笑脸弧线 p.setStyle(Paint.Style.STROKE);//设置空心 RectF oval1=new RectF(150,20,180,40); canvas.drawArc(oval1, 180, 180, false, p);//小弧形 oval1.set(190, 20, 220, 40); canvas.drawArc(oval1, 180, 180, false, p);//小弧形 oval1.set(160, 30, 210, 60); canvas.drawArc(oval1, 0, 180, false, p);//小弧形 canvas.drawText("画矩形:", 10, 80, p); p.setColor(Color.GRAY);// 设置灰色 p.setStyle(Paint.Style.FILL);//设置填满 canvas.drawRect(60, 60, 80, 80, p);// 正方形 canvas.drawRect(60, 90, 160, 100, p);// 长方形 canvas.drawText("画扇形和椭圆:", 10, 120, p); /* 设置渐变色 这个正方形的颜色是改变的 */ Shader mShader = new LinearGradient(0, 0, 100, 100, new int[] { Color.RED, Color.GREEN, Color.BLUE, Color.YELLOW, Color.LTGRAY }, null, Shader.TileMode.REPEAT); // 一个材质,打造出一个线性梯度沿著一条线。 p.setShader(mShader); // p.setColor(Color.BLUE); RectF oval2 = new RectF(60, 100, 200, 240);// 设置个新的长方形,扫描测量 canvas.drawArc(oval2, 200, 130, true, p); // 画弧,第一个参数是RectF:该类是第二个参数是角度的开始,第三个参数是多少度,第四个参数是真的时候画扇形,是假的时候画弧线 //画椭圆,把oval改一下 oval2.set(210,100,250,130); canvas.drawOval(oval2, p); canvas.drawText("画三角形:", 10, 200, p); // 绘制这个三角形,你可以绘制任意多边形 Path path = new Path(); path.moveTo(80, 200);// 此点为多边形的起点 path.lineTo(120, 250); path.lineTo(80, 250); path.close(); // 使这些点构成封闭的多边形 canvas.drawPath(path, p); // 你可以绘制很多任意多边形,比如下面画六连形 p.reset();//重置 p.setColor(Color.LTGRAY); p.setStyle(Paint.Style.STROKE);//设置空心 Path path1=new Path(); path1.moveTo(180, 200); path1.lineTo(200, 200); path1.lineTo(210, 210); path1.lineTo(200, 220); path1.lineTo(180, 220); path1.lineTo(170, 210); path1.close();//封闭 canvas.drawPath(path1, p); /* * Path类封装复合(多轮廓几何图形的路径 * 由直线段*、二次曲线,和三次方曲线,也可画以油画。drawPath(路径、油漆),要么已填充的或抚摸 * (基于油漆的风格),或者可以用于剪断或画画的文本在路径。 */ //画圆角矩形 p.setStyle(Paint.Style.FILL);//充满 p.setColor(Color.LTGRAY); p.setAntiAlias(true);// 设置画笔的锯齿效果 canvas.drawText("画圆角矩形:", 10, 260, p); RectF oval3 = new RectF(80, 260, 200, 300);// 设置个新的长方形 canvas.drawRoundRect(oval3, 20, 15, p);//第二个参数是x半径,第三个参数是y半径 //画贝塞尔曲线 canvas.drawText("画贝塞尔曲线:", 10, 310, p); p.reset(); p.setStyle(Paint.Style.STROKE); p.setColor(Color.GREEN); Path path2=new Path(); path2.moveTo(100, 320);//设置Path的起点 path2.quadTo(150, 310, 170, 400); //设置贝塞尔曲线的控制点坐标和终点坐标 canvas.drawPath(path2, p);//画出贝塞尔曲线 //画点 p.setStyle(Paint.Style.FILL); canvas.drawText("画点:", 10, 390, p); canvas.drawPoint(60, 390, p);//画一个点 canvas.drawPoints(new float[]{60,400,65,400,70,400}, p);//画多个点 //画图片,就是贴图 Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.drawable.ic_launcher); canvas.drawBitmap(bitmap, 250,360, p); } }
阅读全文
0 0
- Android 图片添加白边(类似加框)
- android ListView加HeadView左右切换图片(类似各大新闻客户端)
- android Recyclerview实现类似朋友圈点击添加图片的view
- 给 UITextField 添加左侧指示图片(类似微信登录框)
- 给 UITextField 添加左侧指示图片(类似微信登录框)
- Android自定义组合控件--图片加文字,类似视频播放软件的列表
- android ViewPager加Fragment实现导航加左右滑动(类似QQ、微信)
- Android实现仿美图秀秀给图片加框
- Android----------生成二维码(可加图片)
- Android 图片加边框
- Android图片加边框
- android 图片加文字
- Android图片加水印
- Android开发类似微信九格宫图片
- Android GridView做已选图片展示效果(类似写微博写朋友圈)
- iOS 一个类似QQ的图片添加、图片浏览Demo
- Android 给图片加边框
- android图片加水印,文字
- discuz内容页修改
- 在hadoop中传递变量
- Material Design之ToolBar的完全使用以及在封装
- 技术文章|大数据如何使用
- 46.排列的所有可能组合
- Android 图片添加白边(类似加框)
- 在android的项目中要在string.xml 中显示特殊符号
- 分页查询
- Omnigraffle Pro 6安装与注册码
- 设计模式之适配器模式
- ACTION中定义的变量,怎么传值到JSP页面
- Docker+OpenvSwitch走进VxLAN的世界
- iOS textview加载html并改变图片大小
- 1971-判断素数