android96 内存创建图片副本,画画板

package com.itheima.copy;

import android.os.Bundle;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.view.Menu;
import android.widget.ImageView;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        //这个对象是只读的,不能修改,也就不能加水印,因此要拿到图片的副本才能去修改。
        Bitmap bmSrc = BitmapFactory.decodeFile("sdcard/photo3.jpg");
        
        //创建图片副本
        //1.在内存中创建一个与原图一模一样大小的bitmap对象,创建与原图大小一致的白纸,bmCopy是可读可写的,
        Bitmap bmCopy = Bitmap.createBitmap(bmSrc.getWidth(), bmSrc.getHeight(), bmSrc.getConfig());
        
        //2.创建画笔对象
        Paint paint = new Paint();
        
        //3.创建画板对象,把白纸铺在画板上
        Canvas canvas = new Canvas(bmCopy);
        
        //4.开始作画,把原图的内容绘制在白纸上
        canvas.drawBitmap(bmSrc, new Matrix(), paint);
        
        ImageView iv_src = (ImageView) findViewById(R.id.iv_src);
        ImageView iv_copy = (ImageView) findViewById(R.id.iv_copy);
        iv_src.setImageBitmap(bmSrc);//显示原图,这里没有做缩放,因为这里图片很小
        iv_copy.setImageBitmap(bmCopy);//显示副本
    }


    
}
package com.itheima.copy;

import android.os.Bundle;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.view.Menu;
import android.widget.ImageView;

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        //这个对象是只读的
        Bitmap bmSrc = BitmapFactory.decodeFile("sdcard/photo3.jpg");
        
        //创建图片副本
        //1.在内存中创建一个与原图一模一样大小的bitmap对象,创建与原图大小一致的白纸
        Bitmap bmCopy = Bitmap.createBitmap(bmSrc.getWidth(), bmSrc.getHeight(), bmSrc.getConfig());
        
        //2.创建画笔对象
        Paint paint = new Paint();
        
        //3.创建画板对象,把白纸铺在画板上
        Canvas canvas = new Canvas(bmCopy);
        
        //4.开始作画,把原图的内容绘制在白纸上
        Matrix mt = new Matrix();//对图片的处理是用矩阵Matrix对象实现的
        
        //平移
        mt.setTranslate(20, 40);
        //缩放
        //sx:水平方向的缩放比例
        //sy:竖直方向的缩放比例
        mt.setScale(0.5f, 0.5f);//0.5是缩小到0.5倍
        mt.setScale(0.5f, 0.5f, bmCopy.getWidth() / 2, bmCopy.getHeight() / 2);
        //旋转
        mt.setRotate(45, bmCopy.getWidth() / 2, bmCopy.getHeight() / 2);
        
        //镜面,水平反转
        mt.setScale(-1, 1);
        mt.postTranslate(bmCopy.getWidth(), 0);
        //倒影。竖直反转
        mt.setScale(1, -1);
        mt.postTranslate(0, bmCopy.getHeight());
        canvas.drawBitmap(bmSrc, mt, paint);
        
        ImageView iv_src = (ImageView) findViewById(R.id.iv_src);
        ImageView iv_copy = (ImageView) findViewById(R.id.iv_copy);
        iv_src.setImageBitmap(bmSrc);
        iv_copy.setImageBitmap(bmCopy);
    }


    
}

 保存图片发送sd卡就绪广播:

package com.itheima.paintban;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Matrix;
import android.graphics.Paint;
import android.view.Menu;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.ImageView;

public class MainActivity extends Activity {

    private ImageView iv;

    int startX;
    int startY;

    private Canvas canvas;

    private Paint paint;

    private Bitmap bmCopy;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        //加载画画板的背景图
        Bitmap bmSrc = BitmapFactory.decodeResource(getResources(), R.drawable.bg);
        
        bmCopy = Bitmap.createBitmap(bmSrc.getWidth(), bmSrc.getHeight(), bmSrc.getConfig());
        paint = new Paint();
        canvas = new Canvas(bmCopy);
        //绘制
        canvas.drawBitmap(bmSrc, new Matrix(), paint);
        
        iv = (ImageView) findViewById(R.id.iv);
        iv.setImageBitmap(bmCopy);
        
        //设置触摸侦听
        iv.setOnTouchListener(new OnTouchListener() {
            
            //触摸屏幕时,触摸事件产生时,此方法调用
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                int action = event.getAction();
                switch (action) {
                //用户手指摸到屏幕
                case MotionEvent.ACTION_DOWN:
                    startX = (int) event.getX();
                    startY = (int) event.getY();
                    break;
                //用户手指正在滑动
                case MotionEvent.ACTION_MOVE:
                    int x = (int) event.getX();
                    int y = (int) event.getY();
                    canvas.drawLine(startX, startY, x, y, paint);
                    //每次绘制完毕之后,本次绘制的结束坐标变成下一次绘制的初始坐标
                    startX = x;
                    startY = y;
                    iv.setImageBitmap(bmCopy);
                    break;
                //用户手指离开屏幕
                case MotionEvent.ACTION_UP:
                    break;

                }
                //true:告诉系统,这个触摸事件由我来处理
                //false:告诉系统,这个触摸事件我不处理,这时系统会把触摸事件传递给imageview的父节点,如果父节点的触摸事件也是返回false则父节点也不处理,由于父节点后面没有了则这个消息就没人处理了就丢失了。
                return true;
            }
        });
            
        
    }

    public void red(View v){
        paint.setColor(Color.RED);
    }
    public void green(View v){
        paint.setColor(Color.GREEN);
    }
    public void brush(View v){
        paint.setStrokeWidth(7);
    }
    /*###保存图片
    *
    系统每次收到SD卡就绪广播时,都会去遍历sd卡的所有文件和文件夹,把遍历到的所有多媒体文件都在MediaStore数据库保存一个索引,这个索引包含多媒体文件的文件名、路径、大小
    * 图库每次打开时,并不会去遍历sd卡获取图片,而是通过内容提供者从MediaStore数据库中获取图片的信息,然后读取该图片,如果自己保存一张图片是不会看到的因为sd卡有但是MediaStore数据库中没有所以看不到图片,所以要发送SD卡就绪广播更新MediaStore数据库。
    * 系统开机或者点击加载sd卡按钮时,系统会发送sd卡就绪广播,我们也可以手动发送就绪广播*/
    public void save(View v){
        File file = new File("sdcard/dazuo.png");
        FileOutputStream fos = null;
        try {
            fos = new FileOutputStream(file);
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        bmCopy.compress(CompressFormat.PNG, 100, fos);//压缩成本地文件,CompressFormat.PNG
        
        //发送sd卡就绪广播就会去遍历sd卡更新sd卡图片到MediaStore数据库
        Intent intent = new Intent();
        intent.setAction(Intent.ACTION_MEDIA_MOUNTED);
        intent.setData(Uri.fromFile(Environment.getExternalStorageDirectory()));
        sendBroadcast(intent);
    }
}
原文地址:https://www.cnblogs.com/yaowen/p/4966185.html