2012-08-11 81 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; 
}