android 加载自定义图片并在图片上绘图
来源:毕设
关键词:Bitmap Canvas
//毕设中需要自定义室内地图,并且在地图上绘制轨迹
//此处是一个测试Demo,实现图片的加载和记录手指在屏幕上的运动轨迹
图片的载入
使用系统提供的内容提供者,要点如下:
1.调用android图库的方式:Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
2.使用startActivityForResult(Intent intent, int requestCode) & onActivityResult(int requestCode, int resultCode, Intent data)返回结果到该activity.
3.权限:
4.Bitmap&Canvas的使用见注释内容
        mLoadButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(Intent.ACTION_PICK, MediaStore.Images.Media.EXTERNAL_CONTENT_URI);//调用android图库
                startActivityForResult(intent, RESULT);
            }
        });
  protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if (resultCode ==RESULT_OK) {
            try {
                Uri imageFileUri = data.getData();
                Display defaultDisplay = getWindowManager().getDefaultDisplay();
                float ddw = defaultDisplay.getWidth();
                float ddh = defaultDisplay.getHeight();
                //BitmapFactory.Options options = new BitmapFactory().Options();//注意别写错了,options是静态内部类,需要直接使用外部类直接饮用
                BitmapFactory.Options options = new BitmapFactory.Options();
                /**
                 * inJustDecodeBounds 如果设置为true,并不会把图像的数据完全解码,亦即decodeXyz()返回值为null,但是Options的outAbc中解出了图像的基本信息。
                 * 先设置inJustDecodeBounds= true,调用decodeFile()得到图像的基本信息,利用图像的宽度(或者高度,或综合)以及目标的宽度,得到inSampleSize值,
                 * 再设置inJustDecodeBounds= false,调用decodeFile()得到完整的图像数据。
                 * 先获取比例,再读入数据,如果欲读入大比例缩小的图,将显著的节约内容资源。有时候还会读入大量的缩略图,这效果就更明显了。
                 */
                options.inJustDecodeBounds = true;
                mBitmap = BitmapFactory.decodeStream(getContentResolver()
                        .openInputStream(imageFileUri), null, options);//需要权限android.permission.READ_EXTERNAL_STORAGE
                //计算缩放因子
                int heightRatio = (int) Math.ceil(options.outHeight/ddh);
                int widthRatio = (int) Math.ceil(options.outWidth/ddw);
                if (heightRatio > widthRatio) {
                    options.inSampleSize = heightRatio;
                } else {
                    options.inSampleSize = widthRatio;
                }
                options.inJustDecodeBounds = false;
                mBitmap = BitmapFactory.decodeStream(getContentResolver().openInputStream(imageFileUri), null, options);
                mAlterBitmap = Bitmap.createBitmap(mBitmap.getWidth(), mBitmap.getHeight(), mBitmap.getConfig());
                mCanvas = new Canvas(mAlterBitmap);
                mPaint = new Paint();
                mPaint.setColor(Color.GREEN);
                mPaint.setStrokeWidth(5);
                Matrix matrix = new Matrix();//矩阵
                mCanvas.drawBitmap(mBitmap, matrix, mPaint);
                mIv.setImageBitmap(mAlterBitmap);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }
    }
在图片上绘制
图片被加载到了ImageView控件mIv中,通过设置mIv.setOnTouchListener(),可以实现在图片上的绘制.
                mIv.setOnTouchListener(new View.OnTouchListener() {
                    @Override
                    public boolean onTouch(View v, MotionEvent event) {
                        int action = event.getAction();
                        switch (action) {
                            case MotionEvent.ACTION_DOWN:
                                downx = event.getX();
                                downy = event.getY();
                                break;
                            case MotionEvent.ACTION_MOVE:
                                upx = event.getX();
                                upy = event.getY();
                                mCanvas.drawLine(downx, downy, upx, upy, mPaint);
                                mIv.invalidate();
                                downx = upx;
                                downy = upy;
                                break;
                            case MotionEvent.ACTION_UP:
                                break;
                            default:
                                break;
                        }
                        return true;
                    }
                });
图片的保存
mSaveButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //保存画好的图片
                if(mAlterBitmap!=null){
                    try {
                        Uri imageUri=getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new ContentValues());
                        OutputStream outputStream=getContentResolver().openOutputStream(imageUri);
                        mAlterBitmap.compress(Bitmap.CompressFormat.PNG, 90, outputStream);
                        Toast.makeText(getApplicationContext(), "save!", Toast.LENGTH_SHORT).show();
                    } catch (FileNotFoundException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
效果图

github地址:https://github.com/zhangbz/BitmapTest
android 加载自定义图片并在图片上绘图的更多相关文章
- android 加载图片框架--Glide使用详解
		一.简介 Glide,一个被google所推荐的图片加载库,作者是bumptech.这个库被广泛运用在google的开源项目中,包括2014年的google I/O大会上发布的官方app.(PS:众所 ... 
- Android加载图片的策略
		实现图片缓存也不难,需要有相应的cache策略.这里我采用 内存-文件-网络 三层cache机制,其中内存缓存包括强引用缓存和软引用缓存(SoftReference),其实网络不算cache,这里姑且 ... 
- android加载gif图片
		Android加载GIF图片的两种方式 方式一:使用第三开源框架直接在布局文件中加载gif 1.在工程的build.gradle中添加如下 buildscript { repositories { m ... 
- Android -- 加载大图片到内存,从gallery获取图片,获取图片exif信息
		1. 加载大图片到内存,从gallery获取图片 android默认的最大堆栈只有16M, 图片像素太高会导致内存不足的异常, 需要将图片等比例缩小到适合手机屏幕分辨率, 再加载. 从gallery ... 
- Android学习笔记_51_转android 加载大图片防止内存溢出
		首先来还原一下堆内存溢出的错误.首先在SD卡上放一张照片,分辨率为(3776 X 2520),大小为3.88MB,是我自己用相机拍的一张照片.应用的布局很简单,一个Button一个ImageView, ... 
- Android加载/处理超大图片神器!SubsamplingScaleImageView(subsampling-scale-image-view)【系列1】
		Android加载/处理超大图片神器!SubsamplingScaleImageView(subsampling-scale-image-view)[系列1] Android在加载或者处理超大巨型图片 ... 
- TensorFlow2.0(10):加载自定义图片数据集到Dataset
		.caret, .dropup > .btn > .caret { border-top-color: #000 !important; } .label { border: 1px so ... 
- Android加载图片小结
		应用中用到图片加载需要解决的问题 无网络环境下图片不可用 图片的本地缓存,或者默认预加载的图片 低配置机型,加载图像资源超内存(OutOfMemory, OoM) 需要合理使用内存,尤其是bitmap ... 
- wp加载本地HTML(附带图片,CSS,JS)
		wp加载本地HTML(附带图片,CSS,JS) Windows Phone:Load Local HTML with Img,Css,Js by 唐小崇 http://www.cnblogs.com/ ... 
随机推荐
- MVC学习之前必须掌握的c#基础知识
			一.类自动属性 public class Person { //自动属性 public string Name { get; set; } private int _age; public int a ... 
- C语言学习008:标准错误
			在上一节中的数据文件中(C语言学习007:重定向标准输入和输出),如果文件中的数据包含非法数据,如何让程序显示一条错误的提示消息呢?就需要用到标准错误 #include <stdio.h> ... 
- Type 'Insus.NET.PictureObject' in Assembly 'App_Code, Version=0.0.0.0, Culture=neutral, PublicKeyToken=null' is not marked as serializable.
			昨晚想实现一个功能,需要把一个对象存储于ViewState中去,但在运行时,出现下面的异常. Type 'Insus.NET.PictureObject' in Assembly 'App_Code, ... 
- WinPhone学习笔记(一)——页面导航与页面相关
			最近学一下Windows Phone(接下来简称“WinPhone”)的开发,在很久很久前稍探究一下WinPhone中对一些传感器的开发,那么现在就从头来学学WinPhone的开发.先从WinPhon ... 
- 查看SQL Server多实例的版本
			通过 select @@version 查看当前的 SQL Server 安装的版本: 结果返回的是 SQL Server 2008 R2 (SP1),可安装的明明是 SQL Server 2012 ... 
- 登录校验(demo)
			1. 登录流程分析图: 2. 登录demo: 
- 解决 WinXP下 libcurl.dll 无法定位程序输入点GetTickCount64问题
			1. 问题描述 用 IDA 打开libcurl.dll 可以在导入表看到对 GetTickCount64的引用,在 xp 的kernel32.dll中没有 GetTickCount64, 所以会出现 ... 
- Discuz网站建站运营必备插件
			Discuz界面功能完善,对开发者友好,拥有丰富的插件资源,能够高度定制属于自己风格的论坛服务.但是在拥有近四千个插件的Discuz应用中心,小白站长该如何挑选合适的插件来优化自己的网站呢? 楼主 ... 
- 从源码角度理清memcache缓存服务
			memcache作为缓存服务器,用来提高性能,大部分互联网公司都在使用. 前言 文章的阅读的对象是中高级开发人员.系统架构师. 本篇文章,不是侧重对memcache的基础知识的总结,比如se ... 
- Java接口之间的继承
			/** * Created by xfyou on 2016/11/3. * 多接口之间的继承 */ public class HorrorShow { static void u(Monster b ... 
