2012-08-11 4 views
6

Ich mache einige Verarbeitung (Qualitätsverbesserung und ein wenig Größenanpassung) auf einem Bitmap Objekt und speichern Sie es dann unter Verwendung der bitmap.compress() Funktion, indem Sie den Dateinamen "myfile.png" geben.Wie lädt man ein ImageView mit einer PNG-Datei ohne "setImageBitmap()"?

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

Jetzt möchte ich in einem ImageView um das Bild zu laden, aber ich kann nicht setImageBitmap(), das zu tun verwenden. Gibt es eine Alternative?

Der Grund, warum ich setImageBitmap() verwenden kann nicht ist, dass ich RemoteViews für ein Widget benutzen und Bitmap-Methode führe zu Fehlgeschlagen Binder Transaktion Fehler, wenn das Bild groß ist.

Ich versuchte Bild uri mit dem Code unten, aber das Bild nicht geladen auf den ImageView einzustellen:

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); 

Vielen Dank für Ihre Hilfe!

+2

Gibt es eine Möglichkeit, Byte-Array zu senden? Entschlüsseln Sie dann die Bitmap von der anderen Seite. Ich bin mir nicht sicher. – Shaiful

Antwort

2

Während Bilder in internen Speicher zu speichern, müssen Sie den Modus auf MODE_WORLD_READABLE statt MODE_PRIVATE einzustellen. Dies liegt daran, dass ein Widget vom Startbildschirm verarbeitet wird und nicht auf Ihre Dateien zugreifen kann, wenn Sie den Modus nicht richtig einstellen.

ersetzen also diese Zeile:

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

mit:

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

, auch verwenden Uri.parse() und getPath() statt fromFile(). fromFile() funktioniert nur unter Android 2.2 und höher.

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

Hoffe, das hilft!

1

Mit rv.setUri(R.id.widgetImageView, "setImageURI", "file://myfile.png"); anstelle von scheint das Bild korrekt zu laden. Vielleicht möchten Sie das ausprobieren.

Wenn das nicht funktioniert, gibt es immer noch die Möglichkeit, das Bild zu verkleinern, so dass Sie die setImageBitmap Methode verwenden können. Beispiel:

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; 
}