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);
    }
}
时间: 2024-08-05 04:44:18

android96 内存创建图片副本,画画板的相关文章

Android 多媒体开发学习之创建图片的副本

什么叫创建图片的副本? 因为我们直接从BitmapFactory取出来的图片是可读的,是不可以修改的. 假设用户想修改这张图片,一般是先根据原图在内存中创建和原图一模一样大小的图片,然后在上面修改,用户感觉好像是在原图上修改了,其实不然. public class MainActivity extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedIn

iOS_24_画画板(含取色板)

终于效果例如以下: 一.简单说明 1.使用一个数组 strokesArr(笔画数组)记录全部笔画.数组中保存的是一个个的笔画字典,一个字典就是一个笔画.笔画字典中有三项:笔画的大小.颜色.pointsArrInOneStroke数组,(保存的是touch begin时的落笔点和touch move过程中经过的点) 2.绘制的时候,从strokesArr(笔画数组)里取出每个字典(一个字典就是一个笔画).依据字典中笔画的大小.颜色.笔画所经过的点坐标(pointsArrInOneStroke数组)

iOS_24_画画板

最终效果如下: 一.简单说明 1.使用一个数组 strokesArr(笔画数组)记录所有笔画,数组中保存的是一个个的笔画字典,一个字典就是一个笔画,笔画字典中有三项:笔画的大小.颜色.pointsArrInOneStroke数组,(保存的是touch begin时的落笔点和touch move过程中经过的点) 2.绘制的时候,从strokesArr(笔画数组)里取出每一个字典(一个字典就是一个笔画),根据字典中笔画的大小.颜色.笔画所经过的点坐标(pointsArrInOneStroke数组),

iOS开发-高级UI-小应用画画板

画画板1.搭建界面(3个按钮,1个View) 2.为重写touchesBegan:等方法,需要自定义一个View,新建一个View,名为NJView,然后在故事板将这个View的Class设置为NJView 3.在NJView.m中重写方法 //开始触摸-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event{ //1.获取手指对应UITouch对象 UITouch *touch = [touches anyObject]:

2015年第一篇:Android 画画板

其实画画板这个东西,很多地方都用的到,比如:在qq里面有一个随手涂鸦的画画板,电脑里面画图工具,ps等,这些都是用到的画画板,今天我实现了一个小小的画画板,分享给大家,希望能对你们有所帮助. 1.原理分析:(很简单) 1.当用户触摸到屏幕的时候,开始画画 2.当用户移动的时候,画画的开始位置和结束位置用线连接起来 3.当用户手离开屏幕的时候,也就完成了画画 2.先上效果图: 3.示例源码 package com.zengtao.demo; import java.io.File; import

画画板

#画画板(掌握) >记录用户触摸事件的XY坐标,绘制直线 * 给ImageView设置触摸侦听,得到用户的触摸事件,并获知用户触摸ImageView的坐标 iv.setOnTouchListener(new OnTouchListener() { @Override public boolean onTouch(View v, MotionEvent event) { // TODO Auto-generated method stub switch (event.getAction()) {

iOS 使用UIBezierPath类实现随手画画板

这篇文章介绍一下如何通过这个类实现一个简单的随手画画板的简单程序demo,功能包括:划线(可以调整线条粗细,颜色),撤销笔画,回撤笔画,清除画布,橡皮擦.当然也可以扩展其他的功能. 一.首先看看实现划线部分的关键代码吧! 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 - (void) drawRect: (CGRect) rect {

Android小应用-----画画板

public class MainActivity extends Activity { private ImageView iv; float startX = 0; float startY = 0; //获得一个可以被bitmap Bitmap bitmap = Bitmap.createBitmap(400, 400,Bitmap.Config.ARGB_8888); //创建画布 Canvas canvas = new Canvas(bitmap); //创建画笔 Paint pain

(素材源码)猫猫学IOS(三十四)UI之Quartz2D画画板的实现

猫猫分享,必须精品 原创文章,欢迎转载.转载请注明:翟乃玉的博客 地址:http://blog.csdn.net/u013357243?viewmode=contents 源码:http://download.csdn.net/detail/u013357243/8666923 效果: 代码: NYView NYView.h // // NYView.h // 画画板 // // Created by apple on 15-5-6. // Copyright (c) 2015年 znycat.