Ich arbeite an einer Android App, die Fotos anzeigt, die von Flickr heruntergeladen werden. I erhalten, ein Bitmap-Objekt aus einem Byte-Array, das wiederum von der betreffenden Flickr URL gelesen wird, wie folgt:Android: BitmapFactory.decodeByteArray gibt pixelierte Bitmap
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inDither = true;
opt.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length, opt);
I dann die Bitmap auf eine Leinwand zeichnen im OnDraw Verfahren eines View-Objekt:
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
canvas.drawBitmap(bitmap, 0, 0, paint);
Das Problem ist, dass das resultierende Bild pixelig ist und ich nicht herausfinden kann warum; Ich habe eine Reihe von Varianten der opt und paint Objekte ohne Glück versucht.
Bad image, see pixelation in top left corner http://homepages.inf.ed.ac.uk/s0677975/bad.jpg
Good picture, this is the expected result http://homepages.inf.ed.ac.uk/s0677975/good.jpg
Schauen Sie zum Beispiel: Der Unterschied zwischen dem in meinem app angezeigten Bild und das Bild an der ursprünglichen URL wird grob durch das folgenden demonstriert in den Wolken in der oberen linken Ecke, um den Unterschied zu sehen.
Beachten Sie, dass JPEG-Bilder, die aus den Projektressourcen geladen und auf ähnliche Weise gezeichnet werden, gut angezeigt werden, d. H. Keine Pixelierung aufweisen.
Kann mir jemand einen Hinweis geben, warum das passiert?
Um ein wenig zu erarbeiten, wird das Byte-Array von Flickr wie folgt erhalten; Dies basiert auf Code aus dem Fotostream App von Romain Guy:
InputStream in = new BufferedInputStream(url.openStream(), IO_BUFFER_SIZE);
final ByteArrayOutputStream dataStream = new ByteArrayOutputStream();
out = new BufferedOutputStream(dataStream, IO_BUFFER_SIZE);
copy(in, out);
out.flush();
final byte[] data = dataStream.toByteArray();
PS: Ich stellte auch eine Variante dieser Frage auf der android.developer Google-Gruppe.
Vielen Dank für Ihren Vorschlag - jetzt bin ich wirklich verwirrt! Ich tat wie Sie vorgeschlagen und festgestellt, dass das Bild direkt aus dem heruntergeladenen Byte-Array in der Tat pixelig ist. Dies wird jedoch von genau der gleichen URL heruntergeladen, die beim Zugriff auf meinen Computer NICHT pixelig ist. Hier ist die entsprechende Flickr URL:
http://farm3.static.flickr.com/2678/4315351421_54e8cdb8e5.jpg
Noch seltsamer, wenn ich die gleiche Anwendung im Simulator laufen, anstatt auf meinem Handy (ein HTC Hero), gibt es keine pixelation.
Wie ist das möglich?
Unten ist der Code, den ich von einer URL zum Laden eine Bitmap verwenden - es auf dem Fotostream-App von Romain Guy basiert, und es enthält Vorschlag Wills den rohen Byte-Array zu schreiben in Datei:
Bitmap loadPhotoBitmap(URL url) {
Bitmap bitmap = null;
InputStream in = null;
BufferedOutputStream out = null;
try {
FileOutputStream fos = new FileOutputStream("/sdcard/photo-tmp.jpg");
BufferedOutputStream bfs = new BufferedOutputStream(fos);
in = new BufferedInputStream(url.openStream(),
IO_BUFFER_SIZE);
final ByteArrayOutputStream dataStream = new ByteArrayOutputStream();
out = new BufferedOutputStream(dataStream, IO_BUFFER_SIZE);
copy(in, out);
out.flush();
final byte[] data = dataStream.toByteArray();
bfs.write(data, 0, data.length);
bfs.flush();
BitmapFactory.Options opt = new BitmapFactory.Options();
bitmap = BitmapFactory.decodeByteArray(data, 0, data.length, opt);
} catch (IOException e) {
android.util.Log.e(LOG_TAG, "Could not load photo: " + this, e);
} finally {
closeStream(in);
closeStream(out)
closeStream(bfs);
}
return bitmap;
}
private static void copy(InputStream in, OutputStream out) throws IOException {
byte[] b = new byte[IO_BUFFER_SIZE];
int read;
while ((read = in.read(b)) != -1) {
out.write(b, 0, read);
}
}
private static void closeStream(Closeable stream) {
if (stream != null) {
try {
stream.close();
} catch (IOException e) {
android.util.Log.e(LOG_TAG, "Could not close stream", e);
}
}
}
Werde ich hier verrückt? Beste, Michael.
Ich habe mir die Freiheit genommen, die Bilder zu inlinern, da das im Allgemeinen die Frage schöner und einfacher zu lesen macht. – unwind
Haben Sie jemals einen Workaround gefunden? Ich habe die Vorschläge ausprobiert, aber kein Glück. Es ist super nervig. – blork
als Fußnote, vergessen Sie nicht, dass JPEG in Android-Umgebung nicht verlustfrei ist. obwohl es unterstützt wird, ist es zugunsten von PNG entmutigt. – user836725