2012-09-27 51 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);