2012-08-11 80 views
6

我在Bitmap對象上做了一些處理(質量改進和一些調整大小),然後使用bitmap.compress()函數通過給出文件名「myfile.png」存儲它。如何使用png文件加載ImageView而不使用「setImageBitmap()」?

newbitmap = processImage(bitmap); 
FileOutputStream fos = context.openFileOutput("myfile.png", Context.MODE_PRIVATE); 
newbitmap.compress(CompressFormat.PNG, 100, fos); 

現在我想在ImageView加載這個形象,但我不能使用setImageBitmap()做到這一點。有其他選擇嗎?

我不能使用setImageBitmap()的原因是,我使用RemoteViews一個小部件,並使用位圖方法導致失敗粘合劑交易錯誤時,圖像較大。

我嘗試使用下面的代碼來設置圖像的URI,但圖像不會在ImageView加載:

RemoteViews rv = new RemoteViews(context.getPackageName(), R.layout.widget_layout); 

File internalFile = context.getFileStreamPath("myfile.png"); 
Uri internal = Uri.fromFile(internalFile); 
rv.setImageViewUri(R.id.widgetImageView, internal); 
updateAppWidget(awID, rv); 

感謝您的幫助!

+2

有沒有什麼辦法可以發送字節數組?然後解碼另一側的位圖。我不確定。 – Shaiful 2012-08-11 20:21:54

回答

2

雖然存儲內部存儲的圖像,則必須將模式設置爲MODE_WORLD_READABLE代替MODE_PRIVATE。這是因爲小部件由主屏幕進程處理,並且如果您不設置模式,它無法訪問您的文件。

所以替換此行:

FileOutputStream fos = context.openFileOutput("myfile.png", Context.MODE_PRIVATE); 

有:

FileOutputStream fos = context.openFileOutput("myfile.png", Context.MODE_WORLD_READABLE); 

此外,使用Uri.parse()getPath()而不是fromFile()fromFile()僅適用於Android 2.2及更高版本。

Uri internal = Uri.Parse(internalFile.getPath()); 

希望這會有所幫助!

1

使用rv.setUri(R.id.widgetImageView, "setImageURI", "file://myfile.png");而不是rv.setImageViewUri(R.id.widgetImageView, internal);似乎是正確加載圖像的。你可能想嘗試一下。

如果這不起作用,仍然可以選擇縮小圖像,以便使用setImageBitmap方法。 實施例:

public static Bitmap scaleDownBitmap(Bitmap photo, int newHeight, Context context) { 

final float densityMultiplier = context.getResources().getDisplayMetrics().density;   

int h= (int) (newHeight*densityMultiplier); 
int w= (int) (h * photo.getWidth()/((double) photo.getHeight())); 

photo=Bitmap.createScaledBitmap(photo, w, h, true); 

return photo; 
}