Android 如何将Canvas上绘制的内容保存成本地图片(转)
效果如下图所示
保存在sd卡上的文件为
手机上显示效果为:
1》》在Manifest文件中增加相应权限
<!-- 在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
例如我的Manifest文件代码如下:
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.demo.picturetest"
android:versionCode="1"
android:versionName="1.0" > <!-- 在SDCard中创建与删除文件权限 -->
<uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
<!-- 往SDCard写入数据权限 -->
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> <uses-sdk
android:minSdkVersion="8"
android:targetSdkVersion="19" /> <application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme" >
<activity
android:name=".MainActivity"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application> </manifest>
2》》详细代码如下
package com.demo.picturetest; import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException; import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.graphics.BitmapFactory;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.os.Bundle;
import android.os.Environment;
import android.util.Log;
import android.widget.ImageView; public class MainActivity extends Activity {
private Bitmap mBitmap;
// 画布
private Canvas mCanvas;
// 画笔--画图片
private Paint mPicturePaint = new Paint();
// 画笔--写字
private Paint mTextPaint = new Paint();
// 画笔--写运动数据
private Paint mDataPaint = new Paint(); private ImageView mImageView; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
drawBitmap();
init();
// 展示
mImageView.setImageBitmap(mBitmap); } private void init() {
mImageView = (ImageView) findViewById(R.id.mImageView);
} /**
* 根据图片和文字生成图片
* */
private void drawBitmap() { Bitmap bm_bg = BitmapFactory.decodeResource(getResources(),
R.drawable.dashboard_bg);
// 得到图片的宽、高
int width_bg = bm_bg.getWidth();
int height_bg = bm_bg.getHeight(); // 创建一个你需要尺寸的Bitmap
mBitmap = Bitmap.createBitmap(width_bg, height_bg, Config.ARGB_8888);
// 用这个Bitmap生成一个Canvas,然后canvas就会把内容绘制到上面这个bitmap中
mCanvas = new Canvas(mBitmap); // 绘制背景图片
mCanvas.drawBitmap(bm_bg, 0.0f, 0.0f, mPicturePaint);
// 绘制图片
Bitmap bm_head = BitmapFactory.decodeResource(getResources(),
R.drawable.share_head_img); // 得到图片的宽、高
int width_head = bm_head.getWidth();
int height_head = bm_head.getHeight();
// 绘制图片--保证其在水平方向居中
mCanvas.drawBitmap(bm_head, (width_bg - width_head) / 2, 0.0f,
mPicturePaint); // 绘制文字
mTextPaint.setColor(Color.WHITE);// 白色画笔
mTextPaint.setTextSize(80.0f);// 设置字体大小 // 绘制文字
mDataPaint.setColor(Color.RED);// 红色画笔
mDataPaint.setTextSize(120.0f);// 设置字体大小 String distanceTextString = "运动距离:";
String distanceDataString = String.valueOf(888);
String distanceScalString = "米"; float distanceTextString_width = mTextPaint.measureText(
distanceTextString, 0, distanceTextString.length()); float distanceDataString_width = mDataPaint.measureText(
distanceDataString, 0, distanceDataString.length());
float distanceScalString_width = mTextPaint.measureText(
distanceScalString, 0, distanceScalString.length());
float x = (width_bg - distanceTextString_width
- distanceDataString_width - distanceScalString_width) / 2; mCanvas.drawText(distanceTextString, x, height_head, mTextPaint);// 绘制文字
mCanvas.drawText(distanceDataString, x + distanceTextString_width,
height_head, mDataPaint);// 绘制文字 mCanvas.drawText(distanceScalString, x + distanceTextString_width
+ distanceDataString_width, height_head, mTextPaint);// 绘制文字 // 保存绘图为本地图片
mCanvas.save(Canvas.ALL_SAVE_FLAG);
mCanvas.restore(); File file = new File(Environment.getExternalStorageDirectory()
.getPath() + "/share_pic.png");// 保存到sdcard根目录下,文件名为share_pic.png
Log.i("CXC", Environment.getExternalStorageDirectory().getPath());
FileOutputStream fos = null;
try {
fos = new FileOutputStream(file);
mBitmap.compress(Bitmap.CompressFormat.PNG, 50, fos); } catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
fos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }
}
转自:http://blog.csdn.net/cxc19890214/article/details/39924951
Android 如何将Canvas上绘制的内容保存成本地图片(转)的更多相关文章
- 软件项目技术点(7)——在canvas上绘制自定义图形
AxeSlide软件项目梳理 canvas绘图系列知识点整理 图形种类 目前我们软件可以绘制出来的形状有如下这几种,作为开发者我们一直想支持用户可以拖拽的类似word里面图形库,但目前还没有找到比 ...
- Canvas上绘制几何图形
重要的类自定义View组件要重写View组件的onDraw(Canvase)方法,接下来是在该 Canvas上绘制大量的几何图形,点.直线.弧.圆.椭圆.文字.矩形.多边形.曲线.圆角矩形,等各种形状 ...
- Android开发 ---从互联网上下载文件,回调函数,图片压缩、倒转
Android开发 ---从互联网上下载文件,回调函数,图片压缩.倒转 效果图: 描述: 当点击“下载网络图像”按钮时,系统会将图二中的照片在互联网上找到,并显示在图像框中 注意:这个例子并没有将图 ...
- PHP《将画布(canvas)图像保存成本地图片的方法》
用PHP将网页上的Canvas图像保存到服务器上的方法 2014年6月27日 歪脖骇客 发表回复 8 在几年前HTML5还没有流行的时候,我们的项目经理曾经向我提出这样一个需求:让项目评审专家们在评审 ...
- CSharpGL(19)用glReadPixels把渲染的内容保存为PNG图片(C#)
CSharpGL(19)用glReadPixels把渲染的内容保存为PNG图片(C#) 效果图 本文解决了将OpenGL渲染出来的内容保存到PNG图片的方法. 下载 CSharpGL已在GitHub开 ...
- Android自定义控件7--自定义开关--绘制界面内容
本文实现全自定义控件--自定义开关 本文地址:http://www.cnblogs.com/wuyudong/p/5922316.html,转载请注明源地址. 自定义开关 (View),本文完成下面内 ...
- 在<canvas>上绘制img(drawImage())时需要注意的事
<canvas>标签相当于是一个画布,css决定画布的样式(这块画布的背景颜色.大小等),脚本(一般使用JavaScript)就是画笔,我们可以在这个画布上绘制线条.形状.文字.图片等. ...
- 前端使用html2canvas截图,在canvas上绘制图片及保存图片
1.使用html2canvas 存在的问题: 不同的机型绘制位置不同的问题. 这个主要因为Html动态设置了html的dpr.(dpr可以解决屏幕显示不了1pxborder和无法显示小于12px的文字 ...
- 软件项目技术点(5)——在canvas上绘制动态网格线
AxeSlide软件项目梳理 canvas绘图系列知识点整理 grid类的实现 当鼠标在画布上缩放时,网格能跟着我的鼠标滚动而相应的有放大缩小的效果. 下面是具体实现的代码,draw函数里计算出大 ...
随机推荐
- Vue2.1.7源码学习
原本文章的名字叫做<源码解析>,不过后来想想,还是用“源码学习”来的合适一点,在没有彻底掌握源码中的每一个字母之前,“解析”就有点标题党了.建议在看这篇文章之前,最好打开2.1.7的源码对 ...
- 用资源管理器右键编译 Visual Studio 解决方案文件
每次改动 VC 工程之后都要重新编译,每次 VS 又会生成调试数据库文件,很费时间,于是研究了一下如何在资源管理器中直接编译,还真发现了解决办法. 以下是适用 Visual Studio 2008 的 ...
- 编译Opencv的GPU,利用CUDA加速
首先检查自己的机器是否支持,否则都是白搭(仅仅有NVIDIA的显卡才支持.可在设备管理器中查看) 假设不用GPU.能够直接官网下载预编译好的库 环境: 1 VS2013 2 Opencv2.4.9 3 ...
- 使用jdbc的缺点
使用jdbc开发时有以下缺点 1,数据库连接,使用时就创建,不使用就释放,对数据库进行频繁连接开关和关闭,造成数据库资源浪费,影响数据库的性能 解决:使用数据库连接池管理数据库的连接 2,sql语句使 ...
- ExtJS BorderLayout
<HTML> <HEAD> <TITLE>布局</TITLE> <link rel="stylesheet" type=&qu ...
- Log4j输出格式控制
参数说明例子 %c 列出logger名字空间的全称,如果加上{<层数>}表示列出从最内层算起的指定层数的名字空间 log4j配置文件参数举例 输出显示媒介 假设当前logger名字空间是& ...
- 再有人问你synchronized是什么,就把这篇文章发给他
在再有人问你Java内存模型是什么,就把这篇文章发给他.中我们曾经介绍过,Java语言为了解决并发编程中存在的原子性.可见性和有序性问题,提供了一系列和并发处理相关的关键字,比如synchronize ...
- 简明python教程 --C++程序员的视角(三):模块
模块和包 1 python程序由包(package).模块(module)和函数组成.包是由一系列模块组成的集合.模块是处理某一类问题的函数和类的集合.函数是一段可以重复多次调用的代码. 2 pyth ...
- coursera课程Text Retrieval and Search Engines之Week 4 Overview
Week 4 OverviewHelp Center Week 4 On this page: Instructional Activities Time Goals and Objectives K ...
- C++迭代器失效的几种情况总结
一.序列式容器(数组式容器) 对于序列式容器(如vector,deque),序列式容器就是数组式容器,删除当前的iterator会使后面所有元素的iterator都失效.这是因为vetor,deque ...