package zhangphil.viewtoimage;

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

import android.os.Bundle;
import android.os.Environment;
import android.os.Handler;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;

/**
* 把Android的一个View转换成图片保存
*
* */

public class MainActivity extends Activity {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

final TextView tv = (TextView) findViewById(R.id.textView);
tv.setBackgroundColor(Color.GREEN);
// tv.setDrawingCacheEnabled(true);

final Runnable runnable = new Runnable() {
@Override
public void run() {
viewSaveToImage(tv);
}
};

Button button = (Button) findViewById(R.id.button);
button.setOnClickListener(new View.OnClickListener() {

@Override
public void onClick(View v) {
new Handler().post(runnable);
}
});

}

public void viewSaveToImage(View view) {
view.setDrawingCacheEnabled(true);
view.setDrawingCacheQuality(View.DRAWING_CACHE_QUALITY_HIGH);
view.setDrawingCacheBackgroundColor(Color.WHITE);

// 把一个View转换成图片
Bitmap cachebmp = loadBitmapFromView(view);

// 添加水印
Bitmap bitmap = Bitmap.createBitmap(createWatermarkBitmap(cachebmp,
"@ Zhang Phil"));

FileOutputStream fos;
try {
// 判断手机设备是否有SD卡
boolean isHasSDCard = Environment.getExternalStorageState().equals(
android.os.Environment.MEDIA_MOUNTED);
if (isHasSDCard) {
// SD卡根目录
File sdRoot = Environment.getExternalStorageDirectory();
File file = new File(sdRoot, "test.PNG");
fos = new FileOutputStream(file);
} else
throw new Exception("创建文件失败!");

bitmap.compress(Bitmap.CompressFormat.PNG, 90, fos);

fos.flush();
fos.close();

} catch (Exception e) {
e.printStackTrace();
}

view.destroyDrawingCache();
}

private Bitmap loadBitmapFromView(View v) {
int w = v.getWidth();
int h = v.getHeight();

Bitmap bmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(bmp);

c.drawColor(Color.WHITE);
/** 如果不设置canvas画布为白色,则生成透明 */

v.layout(0, 0, w, h);
v.draw(c);

return bmp;
}

// 为图片target添加水印
private Bitmap createWatermarkBitmap(Bitmap target, String str) {
int w = target.getWidth();
int h = target.getHeight();

Bitmap bmp = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bmp);

Paint p = new Paint();

// 水印的颜色
p.setColor(Color.RED);

// 水印的字体大小
p.setTextSize(16);

p.setAntiAlias(true);// 去锯齿

canvas.drawBitmap(target, 0, 0, p);

// 在中间位置开始添加水印
canvas.drawText(str, w / 2, h / 2, p);

canvas.save(Canvas.ALL_SAVE_FLAG);
canvas.restore();

return bmp;
}
}

Android View转换成图片保存的更多相关文章

  1. Gson字符串编码,字符串转换成图片保存,二进制转换成图片保存

    import java.io.BufferedInputStream; import java.io.ByteArrayInputStream; import java.io.File; import ...

  2. Android网络图片转换成bitmap保存到本地指定文件夹

    下列代码,请求网络图片转换为bitmap,然后保存到指定文件夹,微信,QQ分享,要求缩略图不大于32kb 压缩图片代码,使用了Glide来进行图片压缩处理 Glide.get(ShopDetailsA ...

  3. 将MNIST手写数据集转换成图片保存到本地

    # 加载图片 data = tf.keras.datasets.mnist (x_train, y_train), (x_test, y_test) = data.load_data() plt.im ...

  4. 批量将网页转换成图片或PDF文档技巧分享

    工作中我们有时要将一些批量的网页转换成图片或者PDF文档格式,尽管多数浏览器具有滚动截屏或者打印输出PDF文档功能.可是假设有几十上百张网页须要处理,那也是要人命的.所以我一直想找一款可以批量处理该工 ...

  5. 使用命令行工具将Android应用转换成BlackBerry PlayBook应用

    昨天写了篇文章关于Android应用转换的,通过BlackBerry的在线转换工具将Android应用转换成BlackBerry PlayBook应用.有网友反映说方法有点麻烦,所以今天补上新的转换方 ...

  6. C#技术分享【PDF转换成图片——13种方案】(2013-07-25重新整理)

    原文:C#技术分享[PDF转换成图片--13种方案](2013-07-25重新整理) 重要说明:本博已迁移到 石佳劼的博客,有疑问请到 文章新地址 留言!!! 写在最前面:为了节约大家时间,撸主把最常 ...

  7. Android,View转换bitmap,bitmap转换drawable

    Android View转换Bitmap,Bitmap转换Drawable //测试设置bitmap View view1 = ViewGroup.inflate(context, R.layout. ...

  8. C#技术分享【PDF转换成图片——11种方案】

    1.[iTextSharp.dll],C# 开源PDF处理工具,可以任意操作PDF,并可以提取PDF中的文字和图片,但不能直接将PDF转换成图片. DLL和源码 下载地址:http://downloa ...

  9. 使用的是html5的canvas将文字转换成图片

    当前功能的运用场景是:用户需要传文件给他人,在用户选择文件之后需要显示一个文件图标和所选文件的名称. 当前代码部分是摘自网上,但是已经忘记在什么地方获取的,如有侵权联系小弟后自当删除. 注意:必须在h ...

随机推荐

  1. SSIS部署后执行失败,无法将保护的XML节点解密

    将包属性中的 protectionLevel 设置成DontSaveSensitive 即可.

  2. 【快学SpringBoot】快速上手好用方便的Spring Cache缓存框架

    前言 缓存,在开发中是非常常用的.在高并发系统中,如果没有缓存,纯靠数据库来扛,那么数据库压力会非常大,搞不好还会出现宕机的情况.本篇文章,将会带大家学习Spring Cache缓存框架. 原创声明 ...

  3. HDU4280 Island Transport

    ISAP求最大流模板 #include<cstdio> #include<cstring> #include<algorithm> #include<iost ...

  4. 22 严格模式&this关键词&let&const

    严格模式: ECMA5后的新指令:"use strict" 它不算一条语句,而是一段文字表达式,更早版本的JavaScript会忽略它. 严格模式无法使用未声明的变量. 严格模式的 ...

  5. IEEE 802.11r-2008

    IEEE 802.11r-2008 or fast BSS transition (FT), also called fast roaming, is an amendment to the IEEE ...

  6. query_phase_execution_exception

    ES报错信息: { "error": { "root_cause": [ { "type": "query_phase_execu ...

  7. Java IO流详解(三)——字节流InputStream和OutPutStream

    我们都知道在计算机中,无论是文本.图片.音频还是视频,所有的文件都是以二进制(字节)形式存在的,IO流中针对字节的输入输出提供了一系列的流,统称为字节流.字节流是程序中最常用的流.在JDK中,提供了两 ...

  8. RFID学习

    RFID:射频识别卡有读卡器和电子标签(有源/无源/半有源)组成,工作频率有LF/HF/UHF/MF,低频的通讯距离近(1m)常用来做门禁:高频的通讯距离远可以批量读取. 无源的轻巧/防拆一致性好,在 ...

  9. iPhone代工商,谁敢要求苹果赔偿损失?

    据外国媒体报道,苹果的首席设计师已准备离职,有相关评论称:库克已经不在把硬件设计放到第一位,整个团队都巧妙地遭遇降级.相信熟悉苹果组织的人都知道,他们一切的核心都是围绕"硬件设计" ...

  10. 关于PGSQL连接问题

    今天把运维管理服务移植在Linux下测试,但又不想在Linux中安装PGSQL的服务器,就想让运维管理服务在虚拟机中连接windows的PG服务,却发现PG服务器一直拒绝连接,检查了网络端口之后都没问 ...