【android】把view保存为图片的方法以及解决保存后图片背景变黑色的问题

上代码:

public class MainActivity extends Activity {
	ImageView imgView;
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);

		imgView = (ImageView) findViewById(R.id.imageView);
		imgView.setDrawingCacheEnabled(true);
		// this is the important code :)
		// Without it the view will have a dimension of 0,0 and the bitmap will be null
		imgView.measure(MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED),
		            MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED));
		imgView.layout(0, 0, imgView.getMeasuredWidth(), imgView.getMeasuredHeight());
		Bitmap bitmap = Bitmap.createBitmap(imgView.getDrawingCache());
		imgView.setDrawingCacheEnabled(false);
		String strPath ="/testSaveView/"+UUID.randomUUID().toString()+".png";
		if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED))
		 {
			 File sdCardDir=Environment.getExternalStorageDirectory();
			 FileOutputStream fos = null;
			 try{
				 File file = new File(sdCardDir,strPath);
				 if (!file.getParentFile().exists()) {
					 file.getParentFile().mkdirs();
				 }
				 fos = new FileOutputStream(file);

				//当指定压缩格式为PNG时保存下来的图片显示正常
				 bitmap.compress(CompressFormat.JPEG, 100, fos); 

				//当指定压缩格式为JPEG时保存下来的图片背景为黑色
//				 bitmap.compress(CompressFormat.JPEG, 100, fos);
				 fos.flush();
			 }catch(Exception e){
				 e.printStackTrace();
			 }finally{
				 try {
					 fos.close();
				 } catch (IOException e) {
					 e.printStackTrace();
				 }
			 }
		 }
	}
}

activity_main.xml:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">
    <ImageView
        android:id="@+id/imageView"
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:scaleType="centerInside"
        android:src="@drawable/ic_launcher"/>
</LinearLayout>

需要注意两个问题:

一、调用getDrawingCache()前先要测量,否则的话得到的bitmap为null,这个我在OnCreate()、OnStart()、OnResume()方法里都试验过。

二、当调用bitmap.compress(CompressFormat.JPEG, 100, fos);保存为图片时发现图片背景为黑色,如下图:

这时只需要改成用png保存就可以了,bitmap.compress(CompressFormat.PNG, 100, fos);,如下图:

时间: 2024-08-10 23:22:14

【android】把view保存为图片的方法以及解决保存后图片背景变黑色的问题的相关文章

Android 自定义View需要重写ondraw()等方法

Android  自定义View需要重写ondraw()等方法,这篇博客给大家说说自定义View的写法,需要我们继承View,然后重写一些 方法,方法多多,看你需要什么方法 首先写一个自定义的View 继承View package com.example.engineerjspview; import android.content.Context; import android.graphics.Canvas; import android.graphics.Color; import and

还原TexturePacker plist 文件以及图片的方法 (切开各小图片)

原地址:http://blog.csdn.net/linuxchen/article/details/16865645 Python 脚本:(来自网络) unpack_plist.py 命令行: python unpack_plist.py  plist文件名称 例子: python unpack_plist.py  common      ## plist文件全名为 common.plist [python] view plaincopy #!python import os,sys from

Android中View的绘制过程 onMeasure方法简述

Android中View的绘制过程 当Activity获得焦点时,它将被要求绘制自己的布局,Android framework将会处理绘制过程,Activity只需提供它的布局的根节点. 绘制过程从布局的根节点开始,从根节点开始测量和绘制整个layout tree. 每一个ViewGroup 负责要求它的每一个孩子被绘制,每一个View负责绘制自己. 因为整个树是按顺序遍历的,所以父节点会先被绘制,而兄弟节点会按照它们在树中出现的顺序被绘制. 绘制是一个两遍(two pass)的过程:一个mea

【转】Android中View的绘制过程 onMeasure方法简述 附有自定义View例子

Android中View的绘制过程 当Activity获得焦点时,它将被要求绘制自己的布局,Android framework将会处理绘制过程,Activity只需提供它的布局的根节点. 绘制过程从布局的根节点开始,从根节点开始测量和绘制整个layout tree. 每一个ViewGroup 负责要求它的每一个孩子被绘制,每一个View负责绘制自己. 因为整个树是按顺序遍历的,所以父节点会先被绘制,而兄弟节点会按照它们在树中出现的顺序被绘制. 绘制是一个两遍(two pass)的过程:一个mea

Android中View的绘制过程 onMeasure方法简述 附有自定义View例子

Android中View的绘制过程 当Activity获得焦点时,它将被要求绘制自己的布局,Android framework将会处理绘制过程,Activity只需提供它的布局的根节点. 绘制过程从布局的根节点开始,从根节点开始测量和绘制整个layout tree. 每一个ViewGroup 负责要求它的每一个孩子被绘制,每一个View负责绘制自己. 因为整个树是按顺序遍历的,所以父节点会先被绘制,而兄弟节点会按照它们在树中出现的顺序被绘制. 绘制是一个两遍(two pass)的过程:一个mea

Android中View转换为Bitmap及getDrawingCache=null的解决方法

1.前言 Android中经常会遇到把View转换为Bitmap的情形,比如,对整个屏幕视图进行截屏并生成图片:Coverflow中需要把一页一页的view转换为Bitmap.以便实现复杂的图形效果(阴影.倒影效果等):再比如一些动态的实时View为便于观察和记录数据.需要临时生成静态的Bitmap. 2.实现方法 1)下面是笔者经常用的一个转换方法 public static Bitmap convertViewToBitmap(View view, int bitmapWidth, int

从零开始学android开发-View的setOnClickListener的添加方法

1)第一种,也是最长见的添加方法(一下都以Button为例) Button btn = (Button) findViewById(R.id.myButton); btn .setOnClickListener(new View.OnClickListener() { public void onClick(View v) { //do something } }); 2)第二种,下面这个方法较前一种稍微简单了一些,允许多个Buttons共享一个Listener.通过Switch控制对不同But

linux 下 设置 MySQL8 表名大小写不敏感方法,解决设置后无法启动 MySQL 服务的问题

在安装完成之后,初始化数据库之前,修改 my.cnf 打开mysql配置文件 vim /etc/my.cnf 在尾部追加一行 lower_case_table_names=1 并保存,然后再初始化数据库. 重启mysql, systemctl restart mysqld.service 如果这个操作是初始化数据库之后,也就是安装后运行过服务,那就可能会出错. 错误类似于Job for mysqld.service failed because the control process exite

Android 自定义View (五)&mdash;&mdash;实践

前言: 前面已经介绍了<Android 自定义 view(四)-- onMeasure 方法理解>,那么这次我们就来小实践下吧 任务: 公司现有两个任务需要我完成 (1)监测液化天然气液压罐的液位 (2)监测液化天然气液压罐的压力 UI设计师给我的设计截图如下:   任务一实践开始 第一步:先来看看整体结构组成 第二步:绘制文字 (1)我们将底部的文字.颜色,大小都是可以灵活自定义的,所以先得申明底部文字相关属性参数,方便根据需求进行设置 (2)整体上来看各个区域的颜色,文字画笔的相关属性都是