android之图像处理、缩放、修改图片、绘图
16lz
2021-01-25
安卓中采用的是png格式,采用的是ARGB,一个像素占4个字节;
图片缩放步骤:获取图像的分辨率,手机的分辨率,计算缩放比;
//------------------缩放图片显示----------------- public void suofangImage(){ /// WindowManager mage= (WindowManager) getSystemService(WINDOW_SERVICE);//过时的 // int height = mage.getDefaultDisplay().getHeight();//获取高//int width=mage.getDefaultDisplay().getWidth(); //新的 Point point=new Point(); mage.getDefaultDisplay().getSize(point);int width=point.x;int height=point.y; ImageView imgaV=findViewById(R.id.imagev); //获取图片的宽高 //创建一个位图工厂配置参数 BitmapFactory.Options options=new BitmapFactory.Options(); //解码器不去真正的解析位图,但是还能获取图片的款和高 options.inJustDecodeBounds=true; BitmapFactory.decodeFile("/mnt/sdcard/dog.png"); //获取图片的宽和高 int iH=options.outHeight; int iW=options.outWidth; //计算缩放比 int scale=1; int scaleX=iW/width; int scaleY=iH/height; if(scaleX>=scaleY && scaleX>scale){ scale=scaleX; }else if(scaleXscale){ scale=scaleY; }//按照缩放比显示 options.inSampleSize=scale; //解析位图 options.inJustDecodeBounds=false; Bitmap bitmap=BitmapFactory.decodeFile("/mnt/sdcard/dog.png",options); //显示图片 imgaV.setImageBitmap(bitmap); }
--------------绘制图片、修改图片--------
//修改操作图片 public void changeImage(){ ImageView imgaV=findViewById(R.id.imagev); Bitmap scrBitmap=BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher_background);//直接把图拖进工程中哪图片//创建原图的副本 Bitmap copYBit= Bitmap.createBitmap(scrBitmap.getWidth(),scrBitmap.getHeight(),scrBitmap.getConfig());//创建一个模板,相当于一张白纸 //制作一个画笔 Paint paint=new Paint(); //制作画布 Canvas canvas=new Canvas(copYBit);//开始画图//画了一个和原始图一样的图片//图形处理的api***********//旋转 Matrix matrix=new Matrix();// matrix.setRotate(20,scrBitmap.getWidth()/2,scrBitmap.getHeight()/2);//第一个是旋转角度,后面两个参数是坐标的想,y轴 //缩放//matrix.setScale(0.5f,0.5f); //平移matrix.setTranslate(20,30); //镜面-(左右翻转)---就是缩放和平移的结合matrix.setScale(-1.0f,1.0f);matrix.postTranslate(scrBitmap.getWidth()/2,0);//postTranslate是在上一次的基础上再次翻转,setTranslate的操作每次都是最新的,会覆盖上次的操作 //倒影-(上下翻转)---就是缩放和平移的结合 matrix.setScale(1.0f,-1.0f); matrix.postTranslate(0,scrBitmap.getHeight()/2); canvas.drawBitmap(scrBitmap,new Matrix(),paint); //第二个参数是矩阵 //操作画出来的图片 copYBit.setPixel(20,30, Color.RED);//在20,30这个坐标颜色修改成红色 imgaV.setImageBitmap(copYBit); }
-------------小画板------------- 并保存到sd卡
public void changeImage(){ imgaV = findViewById(R.id.imagev); Bitmap scrBitmap=BitmapFactory.decodeResource(getResources(),R.drawable.ic_launcher_background);//直接把图拖进工程中哪图片//创建原图的副本 final Bitmap copYBit= Bitmap.createBitmap(scrBitmap.getWidth(),scrBitmap.getHeight(),scrBitmap.getConfig());//创建一个模板,相当于一张白纸 //制作一个画笔 final Paint paint=new Paint(); paint.setColor(Color.RED);//画笔颜色改成红色 paint.setStrokeWidth(20);//画笔笔尖宽度 //制作画布 final Canvas canvas=new Canvas(copYBit);//开始画图//画了一个和原始图一样的图片//图形处理的api***********//旋转 Matrix matrix=new Matrix();// matrix.setRotate(20,scrBitmap.getWidth()/2,scrBitmap.getHeight()/2);//第一个是旋转角度,后面两个参数是坐标的想,y轴 //缩放//matrix.setScale(0.5f,0.5f); //平移 matrix.setTranslate(20,30); //镜面-(左右翻转)---就是缩放和平移的结合 matrix.setScale(-1.0f,1.0f); matrix.postTranslate(scrBitmap.getWidth()/2,0);//postTranslate是在上一次的基础上再次翻转,setTranslate的操作每次都是最新的,会覆盖上次的操作 //倒影-(上下翻转)---就是缩放和平移的结合 matrix.setScale(1.0f,-1.0f); matrix.postTranslate(0,scrBitmap.getHeight()/2); canvas.drawBitmap(scrBitmap,new Matrix(),paint); //这是画了一张图,第二个参数是矩阵 canvas.drawLine(20,30,40,50,paint);//画一条线,开始点和结束点 //操作画出来的图片 copYBit.setPixel(20,30, Color.RED);//在20,30这个坐标颜色修改成红色//吧图片保存到手机sd卡************ File file=new File(Environment.getExternalStorageDirectory().getPath(), SystemClock.uptimeMillis()+"png"); FileOutputStream fos= null; try { fos = new FileOutputStream(file); } catch (FileNotFoundException e) { e.printStackTrace(); } /* * 第一个参数是保存图片的格式 * 第二个图片是保存图片的质量,0-100,0最小,100最大 * * SystemClock.uptimeMillis()是当前手机的开机时间 * * */ copYBit.compress(Bitmap.CompressFormat.PNG,100,fos); //发送一条广播欺骗系统图库的应用 Intent intent=new Intent(); intent.setData(Uri.fromFile(Environment.getExternalStorageDirectory())); sendBroadcast(intent); //给iamgeview设置触摸事件 imgaV.setOnTouchListener(new View.OnTouchListener() { private int startY; private int startX; @Override public boolean onTouch(View view, MotionEvent motionEvent) { int action = motionEvent.getAction();//获取当前事件的类型 switch (action){ case MotionEvent.ACTION_DOWN://按下 //获取开始位置 startX = (int) motionEvent.getX(); startY = (int) motionEvent.getY(); break; case MotionEvent.ACTION_MOVE://移动 //获取结束的位置 int endX= (int) motionEvent.getX(); int endY= (int) motionEvent.getY(); canvas.drawLine(startX, startY,endX,endY,paint); //再次显示到imagev上, imgaV.setImageBitmap(copYBit); //更新一下开始的坐标 startX=endX; startY=endY; break; case MotionEvent.ACTION_UP://抬起 break; case MotionEvent.ACTION_CANCEL://取消 break; } return true;//true监听器处理完事件了 } }); }
更多相关文章
- [Android]网页内图片点击查看大图/识别二维码/下载
- Android(安卓)打开相册选择单张图片实现代码
- Android中ConvenientBanner的使用
- Android(安卓)学习笔记(十五):Activity-GalleryView
- 6.22 android计算字符高度宽度,红蓝3D图片的制作原理及NDK生成实
- 学习笔记-android imageSwitcher使用
- android打开存储卡(TF卡\SD卡)中的sqlite文件
- 图片加载和处理的又一个神器 Fresco 的使用摘要记录
- android 拍照图片旋转问题