2011-05-22 269 views
4

對不起,如果此主題已經提交過,但是我在網絡和Google羣組上的所有搜索都無法幫助我。在SurfaceView上繪製縮放的位圖 - 無抗鋸齒

我目前正在開發一款Android SDK的小遊戲,並使用高分辨率位圖,因此我調整大小以匹配設備的分辨率(讓系統爲我做的是 不夠「清晰」)。

我使用了一個SurfaceView,我在其中繪製了一個填充整個表面的畫布。該繪圖使用setXfermode(新的PorterDuffXfermode(PorterDuff.Mode.SRC_IN))來允許掩蔽。 之前,我檢索了各種位圖 - 在createScaledBitmap()的初始化時調整大小並放入緩存 - 並在將此畫布繪製在SurfaceView上之前,在該畫布上應用位圖。

我的問題是,無論我嘗試什麼,我使用的任何顏色設置(抖動,抗鋸齒等等),調整後的位圖不會反鋸齒,並且圖形呈現鋸齒狀邊緣。我嘗試了一切。 我唯一有一點成功的是使用inSampleSize處理所需的縮放大小,並在調用檢索到的 高分辨率位圖上的createScaledBitmap之前強制實施抗鋸齒的第一遍,但效果不夠好。我不能允許爲每個分辨率組合創建大量的預先大小的位圖。我錯過了什麼 ?

感謝很多提前

回答

1

首先,當你載入您的位圖,你確保你不設置選項丟失任何圖像質量argb_8888:

Options options = new Options();  
options.inScaled = false; 
options.inPreferredConfig = Bitmap.Config.ARGB_8888; 
Bitmap pic = BitmapFactory.decodeResource(getResources(), R.id.pic, options); 

當縮放位圖轉在過濾器上:

pic = Bitmap.createScaledBitmap(pic, screenW, screenH, true); 

但是,如果一個人流圖像太多,不可避免地會降低質量。

當您使用底漆可以提高質量,而且通過打開ditherig和過濾速度失去:

Paint paint = new Paint(); 
paint.setFlags(Paint.DITHER_FLAG); 
paint.setFilterBitmap(true); 

最後整個活動窗口可以在argb_4444設置上,而不是argb_8888(OS < 2.3)。

getWindow().setFormat(PixelFormat.RGBA_8888); 
+0

對不起,但我已經這樣做了。我不能在這裏張貼圖片,但結果被視爲地獄,我顯然不明白爲什麼,就好像Android提供的調整大小非常基本,就像MS-Paint一樣。使用Gimp以相同的比例縮放我的位圖會產生漂亮的反鋸齒位圖(注意:我縮放位圖,而不是放大,所以沒有拉伸)。 – altesseFReDD 2011-05-22 17:32:05

+0

經過對我的一個應用程序的更仔細的預測後,我認爲你是對的。縮小並不會產生良好的抗鋸齒圖像,我也無法改進。您可能需要在Google-android支持論壇上進行此操作。在你做之前,你最好做一個簡單但清晰的例子。在我的情況下,我使用小預覽圖像,所以我可以忍受這一點,現在...祝你好運! – Lumis 2011-05-22 20:12:20

+0

啊,謝謝,看到我不是唯一一個遇到這種情況的人,我感到寬慰。我已經將問題提交給了Android開發組的谷歌,但你說得對,我需要改進我的例子。 謝謝 – altesseFReDD 2011-05-23 07:39:14

0

如果它歸結到它,你可以手動抗鋸齒沒有太多的麻煩:如果你的setContentView前instert這條線,你可以恰克這一點。在請求位圖對象重新縮放自身之前,只需將一個簡單的低通濾鏡(類似於NxN平均值)應用於像素數據。

0

你可以自己清除畫布緩衝區!如下:

canvas.drawColor(Color.TRANSPARENT, android.graphics.PorterDuff.Mode.CLEAR);