android之图像处理、缩放、修改图片、绘图

android之图像处理、缩放、修改图片、绘图_第1张图片

安卓中采用的是png格式,采用的是ARGB,一个像素占4个字节;


图片缩放步骤:获取图像的分辨率,手机的分辨率,计算缩放比;

android之图像处理、缩放、修改图片、绘图_第2张图片

//------------------缩放图片显示-----------------
    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)