安卓中采用的是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(scaleX<scaleY&& scaleX>scale){ 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监听器处理完事件了 } }); }
本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。