2011-08-14 87 views
0

我遇到了一個奇怪的問題。我的Android項目中有多個圖像,我將其作爲.png文件存儲在res \ drawable下。我能夠很容易地在運行時提取圖像並將其轉換爲位圖是這樣的:來自資源的圖像正確縮放,但SQlite的圖像blob不是 - Android

Drawable d = getResources().getDrawable(R.drawable.imageId); 
Bitmap bitmap = ((BitmapDrawable)d).getBitmap(); 

這個偉大的工程和形象得到正確縮放,無論該設備具有什麼樣的屏幕密度。我所有的圖像都是200像素×200像素,我的圖像佈局配置爲200像素×200像素。

現在,我已存儲的所有圖像的斑點在SQLite數據庫由於可擴展性問題,我在運行時提取它們,並轉換爲位圖是這樣的:

byte[] bb = cursor.getBlob(columnIndex); 
Bitmap bitmap = BitmapFactory.decodeByteArray(bb, 0, bb.length); 

的圖像顯示,如果畫面精細密度是標準160傾角。但是如果密度更小或更大,則圖像不會縮放,並在160傾角時保持200像素x 200像素。因此,基本上,在較小的屏幕上(120傾角),圖像佔用的空間比應該更大,在更大的屏幕上(240傾角),它佔用的空間比它應該少。

有沒有其他人遇到這個奇怪的問題?任何解釋,解決方法,將非常感激。

非常感謝!

回答

0

使用decodeByteArray(byte[] data, int offset, int length, BitmapFactory.Options opts)和選擇採用設置inDesity讓說160

+0

感謝您的迴應,但這並沒有奏效。然後,我將inDensity設置爲實際的屏幕密度,但這也沒有任何區別。這就是我所做的: DisplayMetrics metrics = new DisplayMetrics(); getWindowManager()。getDefaultDisplay()。getMetrics(metrics); BitmapFactory.Options options = new BitmapFactory.Options(); options.inDensity = metrics.densityDpi; 位圖位圖= BitmapFactory.decodeByteArray(bb,0,bb.length,options); – Ritesh

+0

inDensity表示圖像的密度是多少,所以它應該在這種情況下爲160,而不依賴於屏幕dpi。取決於屏幕密度outDensity。所以正確的方法是:BitmapFactory.Options options = new BitmapFactory.Options(); options.inDensity = 160; – Mikooos

1

好吧,我終於得到它通過使用createScaledBitmap工作()。

從blob創建位圖後,我計算縮放因子,然後計算新的寬度和高度。然後我使用createScaledBitmap()函數中的那些。下面是工作代碼:

public static Bitmap getImageFromBlob(byte[] mBlob) 
{ 
    byte[] bb = mBlob; 
    Bitmap b = BitmapFactory.decodeByteArray(bb, 0, bb.length); 
    DisplayMetrics metrics = new DisplayMetrics(); 
    getWindowManager().getDefaultDisplay().getMetrics(metrics); 
    int newWidth = b.getWidth()*metrics.densityDpi)/DisplayMetrics.DENSITY_DEFAULT; 
    int newHeight = b.getHeight()*metrics.densityDpi)/DisplayMetrics.DENSITY_DEFAULT; 
    return Bitmap.createScaledBitmap(b, newWidth, newHeight, true); 
} 

此鏈接提供的線索: difference between methods to scale a bitmap

0

爲我工作,看到this。但是我不得不說,我認爲SQLite是正確的,而且android drawable的大小是不正確的。