2012-09-02 39 views
1

我的目標是繪製資源圖像的頂部。使用實際像素在圖像上繪製

所以,我從我的資源加載圖像:

bm = BitmapFactory.decodeResource(getResources(), R.drawable.image).copy(Bitmap.Config.ARGB_8888, true); 

我知道這是不是因爲它可以淡然內存問題的最佳途徑,但它不是我現在的關心...... 然後,我創建一個畫布,並畫它

Canvas canv = new Canvas(bm); 
canv.drawLine(0, 10, 50, 70, paint); 

然後我將位圖導出到文件。現在

,存在的問題是:

  • 我用畫線座標不在原始圖像
  • 如果我運行在不同的設備上的應用程序,以不同的屏幕,所產生的圖像的像素是不同的(線有不同的位置和大小)

有沒有一種方法來指定座標wrt原始圖像的像素,還是獲取圖像的結果在不同設備中的結果相同?

謝謝!

回答

1

您遇到的行爲是因爲Android密度概念。這意味着,當您從R.drawable.id創建位圖時,它會根據設備密度縮放圖像。 的機制是幾乎如下:

  1. 檢查的器件密度並選擇此id的最合適的可繪製:從可繪製-HDPI/MDPI /.../默認。這將導致在每個設備上你將有不同的大小,如果你把圖像放到不同的文件夾中(hdpi,mdpi等)
  2. 如果沒有合適的drawable(例如你只提供了一個在/ drawable /文件夾中,但沒有在/ drawable-hpi(etc)/)中 - 它使用此默認可繪製,但根據設備密度和「默認密度」對其進行縮放。

你可以在這裏查看詳細信息:http://developer.android.com/guide/practices/screens_support.html

但是,如果你只需要在所有設備上相同的位圖的分辨率,我可以建議2點的方法:

1)將您的圖像不進繪製/文件夾,但只是一個:/ drawable- nodpi。這將防止結垢,並且將拒絕Android的調整它的器件密度

2)你可以試試這個方法:

InputStream is = getResources().openRawResource(imageId); 
originalBitmap = BitmapFactory.decodeStream(is); 

這樣,你就可以避開Android的密度縮放系統,並得到位圖與/ drawable /文件夾中資源的大小完全相同。

請讓我知道是否需要一些更多的細節。祝你好運

+0

完美!謝謝你太多了! – jamp

+0

你會推薦這兩種方法嗎? – jamp

+0

很高興幫助:) 其實兩者都很好,我想。但是,如果您將使用第二個 - 請確保您將該文件置於默認的「可繪製」文件夾中。因爲如果你將它放在'drawables-mdpi'(例如) - 代碼可能會在hdpi/xhdpi設備上崩潰,因爲android不支持'升級'並且可以說「無資源」。 – AlexN

0

我相信這可能是因爲你把位圖放入res/drawable文件夾。根據您運行應用程序的設備,分辨率會更改位圖,因此該行並未按需要繪製。

您可以通過將位圖中的資產文件夾,並加載它如下解決這個問題:

public Bitmap readBitmapFromMemory(String filename) { 
     Bitmap defautBitmap = null; 
     File filePath = this.getFileStreamPath(filename); 
     FileInputStream fi; 
     try { 
      fi = new FileInputStream(filePath); 
      defautBitmap = BitmapFactory.decodeStream(fi); 

     } 
     catch (FileNotFoundException e) { 
      e.printStackTrace(); 

     } 

     return defautBitmap; 

    } 

我希望這有助於。