Android 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<colors.length;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<bitmap.getWidth();i++){  8 for(int j=0;j<bitmap.getHeight();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

    保存圖片的方法不變。以上所有的構造方法只是給出了部分代碼。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM