2012-09-19 79 views
1

我已將我的遊戲編碼爲320x480,我認爲支持多種分辨率的最簡單方法是縮放最終圖片。你對此有何看法?以這種方式做cpu效率高嗎?Android圖片縮放以支持多種分辨率

我把所有的圖像放在mdpi文件夾中,我將它在屏幕上縮放到緩衝區,然後縮放它以適合屏幕。所有的用戶輸入也將被縮放。

我有這兩個問題: - 你如何繪製一個位圖,沒有android自動縮放它 - 你如何縮放位圖?

回答

0

我正在製作一款遊戲,並且我的目標是1280x800,並且我製作了所有圖片以匹配該分辨率。我第一次啓動遊戲時,我會縮小所有圖像以匹配當前分辨率,並使用縮放的圖像來真實地繪製遊戲。如果您使用的是SurfaceView,那麼在繪製圖像時不應該遇到縮放圖像的問題。只是爲了100%確定我將我的圖像保存在原始目錄中並從那裏加載它們。

要對位圖進行初始縮放,您只需在解碼位圖時使用BitmapFactory.Options來指示它的目標密度和實際要顯示的密度。

+0

我從來沒有想過在原始文件夾中播放圖像之前。這可能會派上用場。 – tyuo9980

3

我在我的項目中多次遇到同樣的問題,每次都因缺乏時間(和懶惰)而感到滿意,我不滿足於最佳解決方案。但最近我發現了一些時間來打擊這個特殊問題。這是我的解決方案,我希望它也能幫助你。

Bitmap scaleWithAspectRatio(Bitmap image) 
     { 
      int imaheVerticalAspectRatio,imageHorizontalAspectRatio; 
      float bestFitScalingFactor=0; 
      float percesionValue=(float) 0.2; 

      //getAspect Ratio of Image 
      int imageHeight=(int) (Math.ceil((double) image.getHeight()/100)*100); 
      int imageWidth=(int) (Math.ceil((double) image.getWidth()/100)*100); 
      int GCD=BigInteger.valueOf(imageHeight).gcd(BigInteger.valueOf(imageWidth)).intValue(); 
      imaheVerticalAspectRatio=imageHeight/GCD; 
      imageHorizontalAspectRatio=imageWidth/GCD; 
      Log.i("scaleDownLargeImageWIthAspectRatio","Image Dimensions(W:H): "+imageWidth+":"+imageHeight); 
      Log.i("scaleDownLargeImageWIthAspectRatio","Image AspectRatio(W:H): "+imageHorizontalAspectRatio+":"+imaheVerticalAspectRatio); 

      //getContainer Dimensions 
      int displayWidth = getWindowManager().getDefaultDisplay().getWidth(); 
      int displayHeight = getWindowManager().getDefaultDisplay().getHeight(); 
      //I wanted to show the image to fit the entire device, as a best case. So my ccontainer dimensions were displayWidth & displayHeight. For your case, you will need to fetch container dimensions at run time or you can pass static values to these two parameters 

      int leftMargin = 0; 
      int rightMargin = 0; 
      int topMargin = 0; 
      int bottomMargin = 0; 
      int containerWidth = displayWidth - (leftMargin + rightMargin); 
      int containerHeight = displayHeight - (topMargin + bottomMargin); 
      Log.i("scaleDownLargeImageWIthAspectRatio","Container dimensions(W:H): "+containerWidth+":"+containerHeight); 

      //iterate to get bestFitScaleFactor per constraints 
      while((imageHorizontalAspectRatio*bestFitScalingFactor <= containerWidth) && 
        (imaheVerticalAspectRatio*bestFitScalingFactor<= containerHeight)) 
      { 
       bestFitScalingFactor+=percesionValue; 
      } 

      //return bestFit bitmap 
      int bestFitHeight=(int) (imaheVerticalAspectRatio*bestFitScalingFactor); 
      int bestFitWidth=(int) (imageHorizontalAspectRatio*bestFitScalingFactor); 
      Log.i("scaleDownLargeImageWIthAspectRatio","bestFitScalingFactor: "+bestFitScalingFactor); 
      Log.i("scaleDownLargeImageWIthAspectRatio","bestFitOutPutDimesions(W:H): "+bestFitWidth+":"+bestFitHeight); 
      image=Bitmap.createScaledBitmap(image, bestFitWidth,bestFitHeight, true); 

      //Position the bitmap centre of the container 
      int leftPadding=(containerWidth-image.getWidth())/2; 
      int topPadding=(containerHeight-image.getHeight())/2; 
      Bitmap backDrop=Bitmap.createBitmap(containerWidth, containerHeight, Bitmap.Config.RGB_565); 
      Canvas can = new Canvas(backDrop); 
      can.drawBitmap(image, leftPadding, topPadding, null); 

      return backDrop; 
     } 
+0

我認爲你的'(int)(Math.ceil((double)image.getHeight()/ 100)* 100)''線有錯誤。你在這裏的方式總是圍繞到100的下一個因素,這將導致許多圖像不保留適當的長寬比。 – Dave

+0

你是否實現並運行了這一塊?它取回你的結果是什麼?這一輪背後有一個原因,那就是獲得一個GCD。 concider得到1542和1477的GCD爲1500和1400. –

+0

當我嘗試使用這個代碼時,它傾向於創建方形圖像而不是維護正確的方面。改變這些線後,似乎解決了這個問題。這對我的特殊需求來說並不是很合適,所以我不再使用它,但那是我嘗試時的經驗。 – Dave

相關問題