效果如下图所示

保存在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上绘制的内容保存成本地图片(转)的更多相关文章

  1. 软件项目技术点(7)——在canvas上绘制自定义图形

    AxeSlide软件项目梳理   canvas绘图系列知识点整理 图形种类 目前我们软件可以绘制出来的形状有如下这几种,作为开发者我们一直想支持用户可以拖拽的类似word里面图形库,但目前还没有找到比 ...

  2. Canvas上绘制几何图形

    重要的类自定义View组件要重写View组件的onDraw(Canvase)方法,接下来是在该 Canvas上绘制大量的几何图形,点.直线.弧.圆.椭圆.文字.矩形.多边形.曲线.圆角矩形,等各种形状 ...

  3. Android开发 ---从互联网上下载文件,回调函数,图片压缩、倒转

     Android开发 ---从互联网上下载文件,回调函数,图片压缩.倒转 效果图: 描述: 当点击“下载网络图像”按钮时,系统会将图二中的照片在互联网上找到,并显示在图像框中 注意:这个例子并没有将图 ...

  4. PHP《将画布(canvas)图像保存成本地图片的方法》

    用PHP将网页上的Canvas图像保存到服务器上的方法 2014年6月27日 歪脖骇客 发表回复 8 在几年前HTML5还没有流行的时候,我们的项目经理曾经向我提出这样一个需求:让项目评审专家们在评审 ...

  5. CSharpGL(19)用glReadPixels把渲染的内容保存为PNG图片(C#)

    CSharpGL(19)用glReadPixels把渲染的内容保存为PNG图片(C#) 效果图 本文解决了将OpenGL渲染出来的内容保存到PNG图片的方法. 下载 CSharpGL已在GitHub开 ...

  6. Android自定义控件7--自定义开关--绘制界面内容

    本文实现全自定义控件--自定义开关 本文地址:http://www.cnblogs.com/wuyudong/p/5922316.html,转载请注明源地址. 自定义开关 (View),本文完成下面内 ...

  7. 在<canvas>上绘制img(drawImage())时需要注意的事

    <canvas>标签相当于是一个画布,css决定画布的样式(这块画布的背景颜色.大小等),脚本(一般使用JavaScript)就是画笔,我们可以在这个画布上绘制线条.形状.文字.图片等. ...

  8. 前端使用html2canvas截图,在canvas上绘制图片及保存图片

    1.使用html2canvas 存在的问题: 不同的机型绘制位置不同的问题. 这个主要因为Html动态设置了html的dpr.(dpr可以解决屏幕显示不了1pxborder和无法显示小于12px的文字 ...

  9. 软件项目技术点(5)——在canvas上绘制动态网格线

    AxeSlide软件项目梳理   canvas绘图系列知识点整理 grid类的实现 当鼠标在画布上缩放时,网格能跟着我的鼠标滚动而相应的有放大缩小的效果. 下面是具体实现的代码,draw函数里计算出大 ...

随机推荐

  1. Android File Hierarchy : System Structure Architecture Layout

    Most of the Android user are using their Android phone just for calls, SMS, browsing and basic apps, ...

  2. 使用Device IO Control 讀寫 USB Mass Storage

    http://www.ezblog.idv.tw/Download/USBStorage.rar 這是一個不透過檔案系統,去讀寫USB Mass Storage 任何位置(包含FAT)的方式 首先需安 ...

  3. UVa409_Excuses, Excuses!(小白书字符串专题)

    解题报告 题意: 找包括单词最多的串.有多个按顺序输出 思路: 字典树爆. #include <cstdio> #include <cstring> #include < ...

  4. 32.NET中加密解密基本概念

    对消息的接收方来说,安全的交流方式需要同时满足3个条件: 1.完整性:消息在传输途中没有被篡改过,即消息是完好无损的. 2.保密性:接收放可以理解或解密来自发送方的信息.(不保证第三方无法获得,但保证 ...

  5. Java遍历Map键、值。获取Map大小的方法

    Map读取键值对,Java遍历Map的两种实现方法 第一种方法是根据map的keyset()方法来获取key的set集合,然后遍历map取得value的值 import java.util.HashM ...

  6. Unity3d通用工具类之数据配置加载类-ini配置文件加载

    Unity3d通用工具类之数据配置加载类-ini配置文件加载 上次我们讲过xml文件的加载配置管理,今天我们换个配置文件,也是比较常见的配置文件.ini格式的数据. 按照国际管理先贴一张啥是.ini文 ...

  7. [11] 楔形体(Wedge)图形的生成算法

    顶点数据的生成 bool YfBuildWedgeVertices ( Yreal width, Yreal length, Yreal height, YeOriginPose originPose ...

  8. 任务栈 启动模式 Task Flag launchMode MD

    Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...

  9. Python 批量修改图片格式和尺寸

    公司的一个项目要求把所有4096x4096的图片全部转化成2048x2048的图片,这种批量转换图片大小的软件网上很多,我的同事原来使用的美图看看的批量转换,但是稍微有点麻烦,每次还需要指定要转换的图 ...

  10. HDOJ-3785 寻找大富翁(优先队列)

    寻找大富翁 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...