我已將我的遊戲編碼爲320x480,我認爲支持多種分辨率的最簡單方法是縮放最終圖片。你對此有何看法?以這種方式做cpu效率高嗎?Android圖片縮放以支持多種分辨率
我把所有的圖像放在mdpi文件夾中,我將它在屏幕上縮放到緩衝區,然後縮放它以適合屏幕。所有的用戶輸入也將被縮放。
我有這兩個問題: - 你如何繪製一個位圖,沒有android自動縮放它 - 你如何縮放位圖?
我已將我的遊戲編碼爲320x480,我認爲支持多種分辨率的最簡單方法是縮放最終圖片。你對此有何看法?以這種方式做cpu效率高嗎?Android圖片縮放以支持多種分辨率
我把所有的圖像放在mdpi文件夾中,我將它在屏幕上縮放到緩衝區,然後縮放它以適合屏幕。所有的用戶輸入也將被縮放。
我有這兩個問題: - 你如何繪製一個位圖,沒有android自動縮放它 - 你如何縮放位圖?
我正在製作一款遊戲,並且我的目標是1280x800,並且我製作了所有圖片以匹配該分辨率。我第一次啓動遊戲時,我會縮小所有圖像以匹配當前分辨率,並使用縮放的圖像來真實地繪製遊戲。如果您使用的是SurfaceView,那麼在繪製圖像時不應該遇到縮放圖像的問題。只是爲了100%確定我將我的圖像保存在原始目錄中並從那裏加載它們。
要對位圖進行初始縮放,您只需在解碼位圖時使用BitmapFactory.Options
來指示它的目標密度和實際要顯示的密度。
我在我的項目中多次遇到同樣的問題,每次都因缺乏時間(和懶惰)而感到滿意,我不滿足於最佳解決方案。但最近我發現了一些時間來打擊這個特殊問題。這是我的解決方案,我希望它也能幫助你。
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;
}
我認爲你的'(int)(Math.ceil((double)image.getHeight()/ 100)* 100)''線有錯誤。你在這裏的方式總是圍繞到100的下一個因素,這將導致許多圖像不保留適當的長寬比。 – Dave
你是否實現並運行了這一塊?它取回你的結果是什麼?這一輪背後有一個原因,那就是獲得一個GCD。 concider得到1542和1477的GCD爲1500和1400. –
當我嘗試使用這個代碼時,它傾向於創建方形圖像而不是維護正確的方面。改變這些線後,似乎解決了這個問題。這對我的特殊需求來說並不是很合適,所以我不再使用它,但那是我嘗試時的經驗。 – Dave
我從來沒有想過在原始文件夾中播放圖像之前。這可能會派上用場。 – tyuo9980