Android Bitmap & Paint & Canvas & Matrix 位图/图片/画板
2017-02-23 00:05
603 查看
Bitmap & Paint & Canvas & Matrix 位图/图片/画板
安卓中最占资源,内存,,最容易导致内存溢出的加载图片
//创建一个位图工厂的配置文件 BitmapFactory.Options options = new BitmapFactory.Options(); //配置解码器不去真正解析图片,去获取图片的高宽信息 options.inJustDecodeBounds = true; BitmapFactory.decodeFile("/mnt/sdcard/pic/jpg",options); //获取图片的高宽信息 int imgWidth = options.outWidth; int imgHeight = options.outHeight; //计算缩放比例 int scale = 1; int scaleX = imgWidth/witdh; //witdh屏幕或界面宽度 int scaleY = imgHeight/height; if(scaleX>=scaleY && scaleX>scale) scale = scaleX; if(scaleY>scaleX && scaleY>scale) scale = scaleY; //配置缩放比, 取消之前的不解析图片 并 按照缩放比加载图片 options.inSampleSize = scale; options.inJustDecodeBounds = false; Bitmap bitmap = BitmapFactory.decodeFile("/mnt/sdcard/pic/jpg", options); //把图片装载控件 img0.setImageBitmap(bitmap);
Paint 画笔
Paint paint1 = new Paint(); paint1.setColor(Color.WHITE); // 画笔颜色 paint1.setAntiAlias(true); // 启用抗锯齿 会变慢 paint1.setDither(true); // 启用抖动处理 更美观 paint1.setStyle(Paint.Style.STROKE); // 设置画笔为空心 paint2.setAlpha(50); // 透明度 paint1.setStrokeWidth((float) 2); // 设置线宽 paint4.setTextSize(this.Scale / 3); //画的文本大小
Canvas 画板
canvas.drawColor(Color.BLACK); // 设置画布背景颜色 canvas.drawLine(GoX, GoY, ToX, ToY, paint); //划线 canvas.drawText("我爱你", startX, startY, paint); //写字 startX/Y左上角坐标
画画
//通过位图工厂获取图片 final Bitmap srcBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.pic00); //获取原图的副本 相同尺寸的空白纸 final Bitmap copyBitmap = Bitmap.createBitmap(srcBitmap.getWidth(),srcBitmap.getHeight(),srcBitmap.getConfig()); final Paint paint = new Paint(); //创建画笔 final Canvas canvas = new Canvas(copyBitmap); //创建画板 canvas.drawBitmap(srcBitmap, new Matrix(), paint); //把原图画上去 paint.setColor(Color.RED); // 画笔颜色 paint.setStrokeWidth((float) 50); // 设置线宽 myImg.setImageBitmap(copyBitmap); //设置图片 myImg.setOnTouchListener(new OnTouchListener() { //设置触摸事件 float startX = 0; float startY = 0; float stopX = 0; float stopY = 0; @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: //按下 Log.e("***************", event.getX()+"-"+event.getY()); //获取开始坐标 startX = event.getX(); startY = event.getY(); break; case MotionEvent.ACTION_MOVE: //移动 //获取结束坐标 stopX = event.getX(); stopY = event.getY(); //画线 canvas.drawLine(startX*2, startY, stopX*2, stopY, paint); //重新设置开始坐标 startX = stopX; startY = stopY; //重新加载图片 myImg.setImageBitmap(copyBitmap); break; case MotionEvent.ACTION_UP: //抬起 break; default: break; } return true; } });
重置操作
canvas.drawBitmap(srcBitmap, new Matrix(), paint); //把原图画上去 myImg.setImageBitmap(copyBitmap);
// 画Y虚线
private void drawYTable(Canvas canvas, Paint paint) { Path path = new Path(); PathEffect pathEffect = new DashPathEffect(new float[] { 5, 2 }, 1); paint.setPathEffect(pathEffect); // Y向线 // (*/2:因为间距是20,我要以10画一条线) for (int i = 1; i < yLabel.length * 2 - 1; i++) { float startY = yPoint - i * Scale / 2; float stopX = xPoint + (this.xLabel.length ) * Scale - Scale/2; path.moveTo(xPoint, startY); path.lineTo(stopX, startY); canvas.drawPath(path, paint); } }
操作图片
Matrix matrix = new Matrix(); //每次操作都会覆盖原先的操作 matrix.setRotate(20, srcBitmap.getWidth()/2, srcBitmap.getHeight()/2); //旋转 matrix.setScale(0.5f, 0.5f); //切换大小 matrix.setTranslate(30, 0); //平移 //镜面效果 matrix.setScale(-1.0f, 1); matrix.postTranslate(srcBitmap.getWidth(), 0); //post 在上次修改的基础上再进行修改 //倒影效果 matrix.setScale(1.0f, -1); matrix.postTranslate(0, srcBitmap.getWidth()); //应用修改 canvas.drawBitmap(srcBitmap, matrix, paint); //把原图画上去
保存图片
try { File file = new File(Environment.getExternalStorageDirectory().getPath(),SystemClock.uptimeMillis()+".jpg"); //开机运行了多久时间 FileOutputStream fos = new FileOutputStream(file); copyBitmap.compress(CompressFormat.JPEG, 100, fos); //保存的类型,质量(0~100),流 //发送一条广播 SD卡重新挂载 更新图库 Intent intent = new Intent(); intent.setAction(Intent.ACTION_MEDIA_MOUNTED); intent.setData(Uri.fromFile(Environment.getExternalStorageDirectory())); sendBroadcast(intent); Toast.makeText(getApplicationContext(), "保存成功", 0).show(); } catch (Exception e) { e.printStackTrace(); }
撕衣服
原理:: 两张图片。有衣服的在上,没衣服在下,把在上面的图片画为透明#00000000/Color.TRANSPARENTimg.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: break; case MotionEvent.ACTION_MOVE: try { for(int x=-20; x<20; ++x) for(int y=-20; y<20; ++y){ if(Math.sqrt(x*x+y*y)<20) //改为圆 copyBitmap.setPixel((int)event.getX()+x,(int)event.getY()+y,Color.TRANSPARENT); //Color.TRANSPARENT透明 } img.setImageBitmap(copyBitmap); //设置图片 } catch (Exception e) { e.printStackTrace(); } break; default: break; } return true; } });
相关文章推荐
- Android -- 图片画画板(canvas、paint、bitmap)
- 通过创建一个位图的XY Chart来学习Android绘图类Rect,Paint,Bitmap,Canvas(附源码)
- Android显示系统之Pixel、Bitmap、Drawable、Canvas、Paint和Matrix之间的联系
- 通过创建一个位图的XY Chart来学习Android绘图类Rect,Paint,Bitmap,Canvas(附源码)
- Android显示系统之Pixel、Bitmap、Drawable、Canvas、Paint和Matrix之间的联系
- Android显示系统之Pixel、Bitmap、Drawable、Canvas、Paint和Matrix之间的联系
- Android Bitmap图片缩放优化,用canvas替代Matrix进行缩放,解决一些错我
- Android 绘图基础:Bitmap(位图)与Matrix(矩阵)实现图片5种操作(平移、旋转、错切、缩放、对称)
- [转]通过创建一个位图的XY Chart来学习Android绘图类Rect,Paint,Bitmap,Canvas(附源码)
- 通过创建一个位图的XY Chart来学习Android绘图类Rect,Paint,Bitmap,Canvas(附源码)
- Android中一些常用类的常用方法(Math、Random、Color、Paint、Canvas、Bitmap、BitmapFactory)
- Bitmap位图渲染与操作(图片移动,放大,缩小,旋转,镜像发转)--android游戏开发
- Android绘图基础之Canvas & Paint & Rect & RectF
- Android中Drawable Bitmap Canvas Paint之间区别
- Android图片旋转,缩放,位移,倾斜,对称完整示例(二)——Bitmap.createBitmap()和Matrix
- Drawable、Bitmap、Canvas、Paint和 Matrix 的关系和使用
- Android中区别Drawable Bitmap Canvas Paint
- Android中Drawable Bitmap Canvas Paint之间区别与转换
- Android当中的防锯齿(Bitmap & Canvas )
- Android应用程序开发之图片操作(一)——Bitmap,surfaceview,imageview,Canvas