2012-09-27 101 views
1

我試圖在畫布上使用矩陣顯示位圖。Android Canvas drawBitmap函數效率

 canvas.drawBitmap(currentBitmap, m_matrix, tempPaint); 

但是結果出現了,圖像看起來很奇怪。在那之後我一直在使用範圍

 canvas.drawBitmap(currentBitmap, 0, 0, tempPaint); 

表明,它不過這裏成像效果很不錯,在這兩種情況下圖像不進行縮放。

我應該如何爲初始顯示設置矩陣屬性?

矩陣顯示是否使用別的東西顯示圖像,因爲該圖像正在改變?

請提供任何教程的詳細說明。

回答

0

您必須使用Matrix。後縮放來縮放圖像,如下例所示。

私人無效drawMatrix(){

矩陣矩陣=新的Matrix(); matrix.postScale(curScale,curScale); matrix.postScale(curScale,curScale);

canvas.drawBitmap(currentBitmap, matrix, tempPaint);} 

有沒有嘗試過....但是應該工作...

+0

我已經嘗試使用matrix.postScale正在重置位圖(1F,1F)或martix.setValues(IDENTITY_MATRIX3X3),但他們都不working.Still位圖最初出現怪異。 – strike

0

搜索很多很多,我終於找到了解決辦法後,一些涉及到同樣的問題線程幫了我。

Quality Issue

Quality problems when resizing an image at runtime

我按照谷歌的教程加載位圖和寫我自己的功能縮放位圖。

public static Bitmap scaleDownBitmap(Bitmap original, boolean recycleOriginal, int newmaxWidth , int newmaxHeight){ 

     if(original == null) 
      return null; 

     Bitmap rtr= null; 
     try{ 

       int origWidth = original.getWidth(); 
       int origHeight = original.getHeight(); 


       if(origWidth <= newmaxWidth && origHeight <= newmaxWidth){ 
         Bitmap b = Bitmap.createBitmap(original); 
         if (recycleOriginal && (original != b)) 
          original.recycle(); 
        return b; 
       } 

       int newWidth = 0; 
       int newHeight = 0; 

       float ratio; 

       if(origWidth > origHeight){ 
         ratio = (float)origWidth/(float)origHeight; 
         newWidth = newmaxWidth; 
         newHeight = (int)((float)newWidth/ratio); 

       } 
       else{ 
         ratio = (float)origHeight/(float)origWidth; 
         newHeight = newmaxHeight; 
         newWidth = (int)((float)newHeight/ratio); 
       } 

       rtr = CreateScaledBitmap(original , newWidth , newHeight); 

       if(recycleOriginal && original != rtr) 
         original.recycle(); 

     } 
     catch (Exception e) { 
      Log.d("Image Compress Error", e.getMessage()); 
     } 

     return rtr; 

} 

    public static Bitmap CreateScaledBitmap(Bitmap paramBitmap, int paramInt1, int paramInt2) 
    { 
     Bitmap localBitmap = Bitmap.createBitmap(paramInt1, paramInt2, paramBitmap.getConfig()); 
     Canvas localCanvas = new Canvas(localBitmap); 
     localCanvas.setDrawFilter(new PaintFlagsDrawFilter(0, 2)); 
     localCanvas.drawBitmap(paramBitmap, new Rect(0, 0, paramBitmap.getWidth(), paramBitmap.getHeight()), 
              new Rect(0, 0, paramInt1, paramInt2), null); 
    return localBitmap; 
} 

現在獲得圖像後,我已將以下參數傳遞給paint。

tempPaint.setFilterBitmap(true); //Line 1 
canvas.drawBitmap(currentBitmap, m_matrix, tempPaint);