热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

解决AndroidBitmap保存过程中背景色异常变黑的技术方案

在开发一个Android应用时,遇到了一个长期未解决的问题:原本白色的背景在保存Bitmap图片时会变成黑色。经过深入研究,发现这可能与创建Bitmap对象时的默认设置有关。通过调整Bitmap的配置参数,并确保在保存图片时正确处理颜色信息,最终成功解决了这一问题。此外,还对代码进行了优化,以提高图片保存的效率和质量。

      之前写的一个Android程序,一直有个bug悬而未决:背景色原来为白色,可保存图片时却变成黑色。昨天又拿出来看了看,突然想到新建Bitmap对象时,默认变量应该和Java中其他新建变量或对象的情况类似,默认值为0。因此猜想新建一个Bitmap时,每个像素的值都是0,即黑色。于是创建一个每个像素点都是255(白色)的Bitmap就行了。

    部分代码如下。

    得到位图的方法:

,,
 1 /**
 2      * 得到相应背景色的位图
 3      * @param width 位图的宽度
 4      * @param height 位图的高度
 5      * @param color 位图的背景色
 6      * @return 该颜色的位图
 7      */
 8     public Bitmap getBitmapByColor(int width,int height,int color){
 9         Bitmap newBitmap;
10         int[] colors=new int[width*height];//新建像素点数组,数组元素个数是位图的宽乘以高
11         for (int i=0;i){
12             colors[i]=color;//将颜色赋值给每一个像素点
13         }
14         newBitmap= createBitmap(colors,width,height,Bitmap.Config.ARGB_8888);
15         return newBitmap;
16 }
View Code

    构造方法:

,,
1 public DrawView(Context context, AttributeSet attributeSet) {
2         super(context, attributeSet);
3         int width = context.getResources().getDisplayMetrics().widthPixels;//得到屏幕的宽度
4         int height = context.getResources().getDisplayMetrics().heightPixels;//得到屏幕的高度
5         Bitmap bitmap=getBitmapByColor(width,height,Color.WHITE);
6         Canvas canvas = new Canvas();
7         Canvas.setBitmap(bitmap);
8         }
View Code

    保存图片的方法:

,,
 1 /**
 2      * 将图片保存在内存卡的pictures文件夹内
 3      * @param fileName 文件名
 4      * @throws IOException
 5      */
 6     public void savePic(String fileName) throws IOException {
 7         File file = new File("/sdcard/pictures/" + fileName + ".png");
 8         file.createNewFile();
 9         FileOutputStream fileOS = new FileOutputStream(file);
10         cacheBitmap.compress(Bitmap.CompressFormat.PNG, 100, fileOS);//注意是PNG格式的。若设置为JPG格式,背景色会变黑
11         fileOS.flush();
12         fileOS.close();
13     }
View Code

     改成这样,运行后发现报错!进行断点调试,发现” canvas.setBitmap(bitmap);”出错了。在网上查了一下,原来Canvas对象在执行setBitmap方法时,首先判断这个位图是不是可变的,如果是不可变的,那么便不能执行setBitmap()方法。bitmap.isMutable()返回一个布尔值。如果bitmap是可变的,则返回true;反之返回false。将这条语句嵌入到代码中,logcat上显示bitmap确实是不可变的。因此得想办法将Bitmap对象变为可变才行。在网上查到,只有一种方法可行,那就是调用bitmap的copy()方法,拷贝一份给另一个Bitmap对象,copy()有一个参数,可以设置拷贝的一份是不是可变的。不过这样原来的Bitmap对象就没什么用了。

     因此其他方法不变,将构造方法改为:

,,
1 public DrawView(Context context, AttributeSet attributeSet) {
2         super(context, attributeSet);
3         int width = context.getResources().getDisplayMetrics().widthPixels;//得到屏幕的宽度
4         int height = context.getResources().getDisplayMetrics().heightPixels;//得到屏幕的高度
5         Bitmap tempBitmap=getBitmapByColor(width,height,Color.WHITE);
6         Canvas canvas = new Canvas();
7         Bitmap bitmap=tempBitmap.copy(tempBitmap.getConfig(),true);//true表示该bitmap对象是可变的;false则反之
8         canvas.setBitmap(bitmap);
9 }
View Code

    这样便运行成功了。

     其实还有一种方法,就是先执行createBitmap()方法,创建一个Bitmap对象。然后将这个Bitmap对象的像素点全部设置为想要的颜色。经测试发现,这样不会导致bitmap变为不可变的。

     部分代码如下。     

     设置位图背景色的方法:

,,
 1 /**
 2      * 设置位图的背景色
 3      * @param bitmap 需要设置的位图
 4      * @param color 背景色
 5      */
 6 public void setBitmapBGColor(Bitmap bitmap,int color){
 7     for(int i=0;i){
 8         for(int j=0;j){
 9             bitmap.setPixel(i,j,color);//将bitmap的每个像素点都设置成相应的颜色
10         }
11     }
12 }
View Code

    构造方法:

,,
1 public DrawView(Context context, AttributeSet attributeSet) {
2         super(context, attributeSet);
3         width = context.getResources().getDisplayMetrics().widthPixels;//得到屏幕的宽度
4         height = context.getResources().getDisplayMetrics().heightPixels;//得到屏幕的高度
5         Bitmap bitmap=createBitmap(width,height,Bitmap.Config.ARGB_8888);
6         setBitmapBGColor(bitmap,Color.WHITE);
7         Canvas canvas = new Canvas();
8         canvas.setBitmap(bitmap);
9 }
View Code

    保存图片的方法不变。以上所有的构造方法只是给出了部分代码。

Android Bitmap保存时背景变为黑色的问题


推荐阅读
  • 本报告记录了嵌入式软件设计课程中的第二次实验,主要探讨了使用KEIL V5开发环境和ST固件库进行GPIO控制及按键响应编程的方法。通过实际操作,加深了对嵌入式系统硬件接口编程的理解。 ... [详细]
  • 在1995年,Simon Plouffe 发现了一种特殊的求和方法来表示某些常数。两年后,Bailey 和 Borwein 在他们的论文中发表了这一发现,这种方法被命名为 Bailey-Borwein-Plouffe (BBP) 公式。该问题要求计算圆周率 π 的第 n 个十六进制数字。 ... [详细]
  • 本文探讨了使用普通生成函数和指数生成函数解决组合与排列问题的方法,特别是在处理特定路径计数问题时的应用。文章通过详细分析和代码实现,展示了如何高效地计算在给定条件下不相邻相同元素的排列数量。 ... [详细]
  • 网络流24题——试题库问题
    题目描述:假设一个试题库中有n道试题。每道试题都标明了所属类别。同一道题可能有多个类别属性。现要从题库中抽取m道题组成试卷。并要求试卷包含指定类型的试题。试设计一个满足要求的组卷算 ... [详细]
  • 本文由chszs撰写,详细介绍了Apache Mina框架的核心开发流程及自定义协议处理方法。文章涵盖从创建IoService实例到协议编解码的具体步骤,适合希望深入了解Mina框架应用的开发者。 ... [详细]
  • 本文提供了一个关于AC自动机(Aho-Corasick Algorithm)的详细解析与实现方法,特别针对P3796题目进行了深入探讨。文章不仅涵盖了AC自动机的基本概念,还重点讲解了如何通过构建失败指针(fail pointer)来提高字符串匹配效率。 ... [详细]
  • 本文探讨了一种常见的C++面试题目——实现自己的String类。通过此过程,不仅能够检验开发者对C++基础知识的掌握程度,还能加深对其高级特性的理解。文章详细介绍了如何实现基本的功能,如构造函数、析构函数、拷贝构造函数及赋值运算符重载等。 ... [详细]
  • 默认情况下,Git 使用 Nano 编辑器进行提交信息的编辑,但如果您更喜欢使用 Vim,可以通过简单的配置更改来实现这一变化。本文将指导您如何通过修改全局配置文件来设置 Vim 作为默认的 Git 提交编辑器。 ... [详细]
  • 在Notepad++中配置Markdown语法高亮及实时预览功能
    本文详细介绍了如何在Notepad++中配置Markdown语法高亮和实时预览功能,包括必要的插件安装和设置步骤。 ... [详细]
  • 探讨如何在映射文件中处理重复的属性字段,以避免数据操作时出现错误。 ... [详细]
  • 利用无代码平台实现高效业务应用开发
    随着市场环境的变化加速,全球企业都在探索更为敏捷的应用开发模式,以便快速响应新兴的商业机遇。然而,传统的软件开发方式不仅成本高昂,而且耗时较长,这往往导致IT与业务部门之间的合作障碍,进而影响项目的成功。本文将探讨如何通过无代码开发平台解决这些问题。 ... [详细]
  • 为何Compose与Swarm之后仍有Kubernetes的诞生?
    探讨在已有Compose和Swarm的情况下,Kubernetes是如何以其独特的设计理念和技术优势脱颖而出,成为容器编排领域的领航者。 ... [详细]
  • 本文介绍了如何通过安装 sqlacodegen 和 pymysql 来根据现有的 MySQL 数据库自动生成 ORM 的模型文件(model.py)。此方法适用于需要快速搭建项目模型层的情况。 ... [详细]
  • 本文探讨了程序员这一职业的本质,认为他们是专注于问题解决的专业人士。文章深入分析了他们的日常工作状态、个人品质以及面对挑战时的态度,强调了编程不仅是一项技术活动,更是个人成长和精神修炼的过程。 ... [详细]
  • 本文介绍了SIP(Session Initiation Protocol,会话发起协议)的基本概念、功能、消息格式及其实现机制。SIP是一种在IP网络上用于建立、管理和终止多媒体通信会话的应用层协议。 ... [详细]
author-avatar
阿思翠
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有