android canvas bitmap去底部黑色,Android Bitmap保存时背景变为黑色的问题

在Android编程中,遇到一个bug:原本背景为白色的位图在保存时变为黑色。通过分析发现,新建Bitmap时默认每个像素值为0(黑色)。解决方案是创建一个全白色像素的Bitmap。本文分享了两种实现方式:一是通过创建像素数组并设置为白色,二是直接设置Bitmap的像素颜色。最后成功解决了位图保存后背景变黑的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

部分代码如下。

得到位图的方法:

cdec0645add3fc3c328197dda5c76203.png

81178cc93a2a3bb5048d90d76e7ec935.png

1 /**

2 * 得到相应背景色的位图

3 * @paramwidth 位图的宽度

4 * @paramheight 位图的高度

5 * @paramcolor 位图的背景色

6 * @return该颜色的位图

7 */

8 public Bitmap getBitmapByColor(int width,int height,intcolor){

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 returnnewBitmap;

16 }

View Code

构造方法:

cdec0645add3fc3c328197dda5c76203.png

81178cc93a2a3bb5048d90d76e7ec935.png

1 publicDrawView(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 = newCanvas();

7 Canvas.setBitmap(bitmap);

8 }

View Code

保存图片的方法:

cdec0645add3fc3c328197dda5c76203.png

81178cc93a2a3bb5048d90d76e7ec935.png

1 /**

2 * 将图片保存在内存卡的pictures文件夹内

3 * @paramfileName 文件名

4 * @throwsIOException

5 */

6 public void savePic(String fileName) throwsIOException {

7 File file = new File("/sdcard/pictures/" + fileName + ".png");

8 file.createNewFile();

9 FileOutputStream fileOS = newFileOutputStream(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对象就没什么用了。

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

cdec0645add3fc3c328197dda5c76203.png

81178cc93a2a3bb5048d90d76e7ec935.png

1 publicDrawView(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 = newCanvas();

7 Bitmap bitmap=tempBitmap.copy(tempBitmap.getConfig(),true);//true表示该bitmap对象是可变的;false则反之

8 canvas.setBitmap(bitmap);

9 }

View Code

这样便运行成功了。

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

部分代码如下。

设置位图背景色的方法:

cdec0645add3fc3c328197dda5c76203.png

81178cc93a2a3bb5048d90d76e7ec935.png

1 /**

2 * 设置位图的背景色

3 * @parambitmap 需要设置的位图

4 * @paramcolor 背景色

5 */

6 public void setBitmapBGColor(Bitmap bitmap,intcolor){

7 for(int i=0;i

8 for(int j=0;j

9 bitmap.setPixel(i,j,color);//将bitmap的每个像素点都设置成相应的颜色

10 }

11 }

12 }

View Code

构造方法:

cdec0645add3fc3c328197dda5c76203.png

81178cc93a2a3bb5048d90d76e7ec935.png

1 publicDrawView(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 = newCanvas();

8 canvas.setBitmap(bitmap);

9 }

View Code

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

原文:http://www.cnblogs.com/cestlavie/p/4162127.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值