Android的圖片疊加


android.graphics.Bitmap.Config是一個枚舉類型,里面定義了位圖的四種格式.
 
ALPHA_8,ARGB_4444,ARGB_8888都是透明的位圖,也就是所字母A代表透明.
 

從名字中可以看出:

    ALPHA_8: 一種透明度為8位的位圖.

    ARGB_4444: A,R,G,B,每一個參數由4bit表示,是一種16位的位圖.

    ARGB_8888: A,R,G,B,每一個參數由8bit來表示,是一種32位的位圖.

    RGB_565: R,G,B,三個參數分別占5bit,6bit,5bit,是一種三原色通道經過壓縮的16位位圖.
Bitmap newBitmap = Bitmap. createBitmap( imgMapWidth,imgMapHeight , Bitmap.Config.RGB_565 );

 android中可以通過以上的方式來創建一BMP格式的位圖,只是圖片的寬和高的值太大時,會使android的VM產生內存溢出的Exception,解決的方法之一,在生成該對象時,通過設Bitmap.Config,來壓縮該位圖在生成時的大小。從上面的4個屬性值看來,壓縮的最大值可以達到2^8。

 
以下方法能有效解決新建位圖的大小過大的問題:
    imageMap是一位圖的對象,尺寸有點大,1800*1600,用上面的方法創建位圖會拋出異常。
    以下的方法通過判斷當前的位圖是否可畫(可在上面畫圖),而決定是否復制一新對象,然后在可畫圖的對象上新建一畫布,然后在上面畫圖,最后就是保存了。
//在指定的位圖上添加圖標
private Bitmap addMarkToImageMap(int x, int y){
    //創建一個和原圖同樣大小的位圖 
    //Bitmap newBitmap = Bitmap.createBitmap(imgMapWidth,imgMapHeight, Bitmap.Config.RGB_565);
    Bitmap newBitmap = imageMap;
    if(!newBitmap.isMutable()){
         newBitmap = imageMap.copy(Bitmap.Config.RGB_565, true);
    }
    Canvas canvas = new Canvas(newBitmap);
    canvas.drawBitmap( markImg, x, y, paint );//插入圖標 
    canvas.save(Canvas. ALL_SAVE_FLAG); 
    //存儲新合成的圖片
    canvas.restore(); 
    return newBitmap;  
}

順便延伸一下,在圖片上寫字的例子就出來了:

 

 /**
      * 圖片上畫字
      * */
     private Bitmap drawTextAtBitmap(Bitmap bitmap,String text){
          
          int x = bitmap.getWidth();
          int y = bitmap.getHeight();
          
          // 創建一個和原圖同樣大小的位圖
          Bitmap newbit = Bitmap.createBitmap(x, y, Bitmap.Config.ARGB_8888);
          
          Canvas canvas = new Canvas(newbit);
          
          Paint paint = new Paint();
          
          // 在原始位置0,0插入原圖
          canvas.drawBitmap(bitmap, 0, 0, paint);
          
          paint.setColor(Color.parseColor("#dedbde"));
          
          paint.setTextSize(20);
          
          // 在原圖指定位置寫上字
          canvas.drawText(text, 53 , 30, paint);
          
          canvas.save(Canvas.ALL_SAVE_FLAG);
          
          // 存儲
          canvas.restore();
          
          return newbit;
     }

  大家可能知道Bitmap的疊加處理在Android平台中可以通過Canvas一層一層的畫就行了,而Drawable中如何處理呢?
  除了使用BitmapDrawable的getBitmap方法將Drawable轉換為Bitmap外,


  今天給大家說下好用簡單的 LayerDrawable類,LayerDrawable顧名思義就是層圖形對象。
  下面直接用一個簡單的代碼表示:

    Bitmap bm = BitmapFactory.decodeResource(getResources(),R.drawable.cwj);
    Drawable[] array = new Drawable[3];

    array[0] = new PaintDrawable(Color.BLACK); //黑色
    array[1] = new PaintDrawable(Color.WHITE); //白色

    array[2] = new BitmapDrawable(bm); //位圖資源

    LayerDrawable ld = new LayerDrawable(array); //參數為上面的Drawable數組
    ld.setLayerInset(1, 1, 1, 1, 1);  //第一個參數1代表數組的第二個元素,為白色
    ld.setLayerInset(2, 2, 2, 2, 2); //第一個參數2代表數組的第三個元素,為位圖資源
    mImageView.setImageDrawable(ld);

  上面的方法中LayerDrawable是關鍵,Android開發網提示setLayerInset方法原型為
  public void setLayerInset (int index, int l, int t, int r, int b) 其中第一個參數為層的索引號,
  后面的四個參數分別為left、top、right和bottom。對於簡單的圖片合成我們可以將第一和第二層的
  PaintDrawable換成BitmapDrawable即可實現簡單的圖片合成。

 

附:Android實戰經驗之圖像處理及特效處理的集錦(總結版)

1     Android學習筆記進階之在圖片上塗鴉(能清屏)

2    Android學習筆記之詳細講解畫圓角圖片

3   Android學習筆記進階20之得到圖片的縮略圖

4    Android學習筆記進階19之給圖片加邊框

5    Android學習筆記進階18之畫圖並保存圖片到本地

6   android圖像處理系列之三--圖片色調飽和度、色相、亮度處理

7   android圖像處理系列之四--給圖片添加邊框(上)

8  android圖像處理系列之五--給圖片添加邊框(中)

9   android圖像處理系列之六--給圖片添加邊框(下)-圖片疊加

10   android圖片特效處理之懷舊效果

11  android圖片特效處理之模糊效果

12   android圖片特效處理之銳化效果

13 android圖片特效處理之浮雕效果

14 android圖片特效處理之底片效果

15 android圖片特效處理之光照效果

16 android圖片特效處理之圖片疊加

17  android圖片特效處理之光暈效果

18 Android 給圖片加邊框

19 Android學習筆記進階14之像素操作

20 Android學習筆記進階十二之裁截圖片

21 Android學習筆記之Bitmap位圖的縮放

22 Android學習筆記之Bitmap位圖的旋轉

23 Android學習筆記之Bitmap位圖雖觸摸點移動

from:http://blog.csdn.net/sjf0115/article/details/7338544

 

 

 


免責聲明!

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



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