Android: BitmapFactory.decodeByteArray donne bitmap pixélisé

Je suis en train de travailler sur une application Android qui permet d'afficher les photos qui sont téléchargés à partir de Flickr. Je obtenir un objet bitmap à partir d'un tableau d'octets, qui est lu par le Flickr de l'URL, comme suit:

BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inDither = true;
opt.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length, opt);

Je puis dessiner l'image sur une toile de dans la méthode onDraw de Vue de l'objet:

Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
canvas.drawBitmap(bitmap, 0, 0, paint); 

Le problème est que l'image est pixélisée, et je ne peux pas comprendre pourquoi; j'ai essayé un certain nombre de variations de l'opt et de la peinture des objets avec pas de chance. La différence entre l'image affichée dans mon application et de l'image à l'URL d'origine est à peu près démontré par le texte suivant:

Mauvaise image, voir la pixelisation dans le coin en haut à gauche http://homepages.inf.ed.ac.uk/s0677975/bad.jpg

Bonne image, c'est le résultat attendu http://homepages.inf.ed.ac.uk/s0677975/good.jpg

Look par exemple, à regarder les nuages dans le coin en haut à gauche pour voir la différence.

Noter que les images JPEG qui sont chargés de les ressources du projet et élaboré de manière similaire, afficher amende, c'est à dire pas de pixelisation.

Quelqu'un peut-il me donner un indice pour expliquer ce qui se passe?

Développer un peu, le tableau d'octets est obtenu à partir de Flickr comme suit; c'est basé sur le code de la Photostream application par 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: j'ai aussi posté une variante de cette question sur l'android.développeur Google groupe.


Merci beaucoup pour votre suggestion -- maintenant, je suis vraiment perplexe! J'ai fait comme vous l'avez suggéré, et a constaté que l'image résultant directement de l'téléchargé tableau d'octets est en effet pixélisé. Cependant, ce qui est téléchargé à partir d'exactement la même URL, ce qui, lors de l'accès sur mon ordinateur, n'est PAS pixélisé. Ici, c'est le correspondant de Flickr URL:

http://farm3.static.flickr.com/2678/4315351421_54e8cdb8e5.jpg

Encore plus étrange, quand je lance la même application dans le simulateur, plutôt que sur mon téléphone (HTC Hero), il n'y a pas de pixelisation.

Comment diable est-ce possible?

Ci-dessous le code que j'ai utiliser pour le chargement d'une image bitmap à partir d'une URL-il est basé sur le Photostream application par Romain Guy, et il intègre Aura une suggestion d'écrire brutes tableau d'octets dans le fichier:

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

Suis-je fou ici?
Mieux,
Michael.

source d'informationauteur Michael Pedersen