图片加载到内存、原图实现画画、扒衣服

来源:互联网 发布:mac新浪微博客户端 编辑:程序博客网 时间:2024/04/19 09:06
public class MainActivity extends Activity {    private ImageView iv;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        iv = (ImageView) findViewById(R.id.iv);    }    public void click(View view){        //相当消耗内存资源 根据图片的分辨率而定        // Bitmap bitmap = BitmapFactory.decodeFile("/mnt/sdcard/photo.jpg");        // iv.setImageBitmap(bitmap);        //1.得到屏幕的宽高信息        WindowManager wm = getWindowManager();        int screenWidth = wm.getDefaultDisplay().getWidth();        int screenHeight = wm.getDefaultDisplay().getHeight();        System.out.println("屏幕宽高:"+screenWidth+"-"+screenHeight);        //2.得到图片的宽高。        BitmapFactory.Options opts = new Options();//解析位图的附加条件        opts.inJustDecodeBounds = true;//不去解析真实的位图,只是获取这个位图的头文件信息        Bitmap bitmap = BitmapFactory.decodeFile("/mnt/sdcard/photo.jpg", opts);        int bitmapWidth = opts.outWidth;//图片真实的宽度        int bitmapHeight = opts.outHeight;        System.out.println("图片宽高: "+bitmapWidth+"-"+bitmapHeight);        //3.计算缩放比例        int dx = bitmapWidth/screenWidth;        int dy = bitmapHeight/screenHeight;        int scale = 1;        if(dx>dy&&dy>1){            System.out.println("按照水平方法缩放,缩放比例:"+dx);             scale = dx;        }        if(dy>dx&&dx>1){            System.out.println("按照垂直方法缩放,缩放比例:"+dy);            scale = dy;        }        //4.缩放加载图片到内存。        opts.inSampleSize = scale;        opts.inJustDecodeBounds = false;//真正的去解析这个位图。        bitmap = BitmapFactory.decodeFile("/mnt/sdcard/photo.jpg", opts);        iv.setImageBitmap(bitmap);    }}读取存储卡权限: <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
public class MainActivity extends Activity {    private ImageView iv1, iv2;    private Bitmap alterBitmap;    private Bitmap srcBmp;    /*********************/    private Bitmap basebBitmap;    Canvas canvas1;    Paint paint1;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        iv1 = (ImageView) findViewById(R.id.iv1);        iv2 = (ImageView) findViewById(R.id.iv2);        // 给第一个imageview默认设置一个位图,从资源中加载一个图片        srcBmp = BitmapFactory.decodeResource(getResources(),                R.drawable.ic_launcher);        iv1.setImageBitmap(srcBmp);        // 创建原图的一个副本。 可修改 创建的是一个空白的图形。        alterBitmap = Bitmap.createBitmap(srcBmp.getWidth() * 2,                srcBmp.getHeight() * 2, srcBmp.getConfig());        /**************************************/        //画笔初始化        paint1 = new Paint();        paint1.setStrokeWidth(5);        paint1.setColor(Color.GREEN);        //创建一个 可以被修改的 bitmap 并且是空白的位图        basebBitmap = Bitmap.createBitmap(320,320, Bitmap.Config.ARGB_8888);        canvas1 = new Canvas(basebBitmap);//准备一个画布,并在画布上铺好纸  ,canvas1:画板   basebBitmap相当于一张白纸        canvas1.drawColor(Color.WHITE);//前景 为白色        // 知道用户手指在屏幕上的移动的轨 迹        iv1.setOnTouchListener(new OnTouchListener() {            int startX;//定义手指开始的坐标            int startY;//定义手指结束的坐标                  @Override            public boolean onTouch(View v, MotionEvent event) {                switch (event.getAction()) {                case MotionEvent.ACTION_DOWN://用户手触摸屏幕时                                 // event.getRawX() 当前手指在屏幕上的位置,手指在窗体的位置,此时画的线和手指之间有很大的空隙                    startX = (int) event.getX();//当前手指在控件上的位置                    startY = (int) event.getY();                    break;                case MotionEvent.ACTION_MOVE://用户手移动时                    int newX = (int) event.getRawX();//当前手指在屏幕上的位置                    int  newY =  (int) event.getRawY();                                     canvas1.drawLine(startX, startY, newX, newY, paint1);                    //用户所画的内容在组件中显示                    iv1.setImageBitmap(basebBitmap);                    break;                case MotionEvent.ACTION_UP://用户手 离开时                    break;                default:                    break;                }                return false;            }        });    }    /*     * 将所画的内容保存起来     *      */    public void save(View view){                try {            File file = new File(Environment.getExternalStorageDirectory(),System.currentTimeMillis()+".jpg");            FileOutputStream outputStream  = new  FileOutputStream(file);            basebBitmap.compress(CompressFormat.JPEG, 100, outputStream);            //模拟一个消息 通知系统 sd卡 被重新挂载了            Intent intent2 = new Intent();            intent2.setAction(Intent.ACTION_MEDIA_MOUNTED);            //告诉系统 哪个文件路径被 上善挂载了            intent2.setData(Uri.fromFile(Environment.getExternalStorageDirectory()));            //发送一个广播通知系统,这样图库中就有所画的画了            sendBroadcast(intent2);        } catch (FileNotFoundException e) {            Toast.makeText(this, "保存图片失败", 0).show();            e.printStackTrace();        }        Toast.makeText(this, "保存图片成功", 0).show();    }    //从图库中选择 图片,并返回    public void image() {        // 启动图库,并获取所选择的图片        Intent intent = new Intent();        intent.setAction(Intent.ACTION_PICK);        intent.setType("image/*");        startActivityForResult(intent, 0);    }       @Override    protected void onActivityResult(int requestCode, int resultCode, Intent data) {        // 图片的uri 路径        Uri uri = data.getData();        // 获取的是图库的缩略图        // Bitmap bitmap = data.getParcelableExtra("data");        // 显示在图片控件中        super.onActivityResult(requestCode, resultCode, data);    }    /*****************************/    /**     * 创建原图 bm的一个拷贝。副本 在原图上画画     *      * @param view     */    public void click(View view) {        // 1.准备一个画板 在上面放上准备好的 空白的位图        Canvas canvas = new Canvas(alterBitmap);        // 2.准备一个画笔        Paint paint = new Paint();        paint.setColor(Color.BLACK);        /**         * 1.将画笔的颜色设为 透明         * 2.可以利用 帧布局, 下面一张图片,上面一张图片,         * 3.即可 利用 画笔 实现 扒衣服的 效果         *          */        paint.setColor(Color.TRANSPARENT);//画笔的颜色 设为透明,        // 3.在画布 上 画画        Matrix m = new Matrix();        m.setScale(2.0f, 2.0f);        canvas.drawBitmap(srcBmp, m, paint); //在原图上 画画        iv2.setImageBitmap(alterBitmap);// 把原图的副本设置到界面上。    }}
public class MainActivity extends Activity {    private ImageView iv;    // 可以修改的位图    private Bitmap alertBitmap;    private Canvas canvas;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        iv = (ImageView) findViewById(R.id.iv);        //原图        Bitmap bitmap = BitmapFactory.decodeResource(getResources(),                R.drawable.pre);        // 创建一个空白的原图的拷贝        alertBitmap = Bitmap.createBitmap(bitmap.getWidth(),                bitmap.getHeight(), bitmap.getConfig());        //要对图片进行一些缩放操作,避免 挂 掉        canvas = new Canvas(alertBitmap);        Paint paint = new Paint();        paint.setColor(Color.BLACK);        canvas.drawBitmap(bitmap, new Matrix(), paint);// new Matrix() :以原来的大小显示图片        iv.setImageBitmap(alertBitmap);        iv.setOnTouchListener(new OnTouchListener() {            @Override            public boolean onTouch(View v, MotionEvent event) {                switch (event.getAction()) {                case MotionEvent.ACTION_DOWN:// 手指按下屏幕                    System.out.println("action down");                    break;                case MotionEvent.ACTION_MOVE:// 手指在屏幕上移动                    int x = (int) event.getX();                    int y = (int) event.getY();                    System.out.println("设置("+x+","+y+")透明颜色");                    //将手指所在的点 的 上下 都设置为 透明的                    for(int i=-4;i<5;i++){                        for(int j=-4;j<5;j++){                            try{                        //将手移动的位置 设置为 透明色                            alertBitmap.setPixel(x+i, y+j, Color.TRANSPARENT);                            }catch (Exception e) {                            }                        }                    }                    //显示修改的图片                    iv.setImageBitmap(alertBitmap);                    break;                case MotionEvent.ACTION_UP:// 手指离开屏幕                    MediaPlayer.create(getApplicationContext(), R.raw.higirl).start();                    break;                }                return true;//可以重复循环的处理事件            }        });    }}
0 0
原创粉丝点击