Tôi đang làm việc trên một ứng dụng Android hiển thị ảnh được tải xuống từ Flickr. Tôi có được một đối tượng bitmap từ một mảng byte, mà lần lượt được đọc từ URL Flickr có liên quan, như sau:Android: BitmapFactory.decodeByteArray cung cấp bitmap pixelated
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inDither = true;
opt.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap bitmap = BitmapFactory.decodeByteArray(data, 0, data.length, opt);
sau đó tôi rút ra những bitmap vào một canvas trong phương pháp OnDraw của một Xem đối tượng:
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG | Paint.FILTER_BITMAP_FLAG);
canvas.drawBitmap(bitmap, 0, 0, paint);
Vấn đề là hình ảnh kết quả là pixelated và tôi không thể hiểu tại sao; Tôi đã thử một số biến thể của các đối tượng lựa chọn và vẽ mà không có may mắn. Sự khác biệt giữa các hình ảnh hiển thị trong ứng dụng của tôi và hình ảnh tại URL ban đầu được khoảng chứng minh bằng cách như sau:
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
Nhìn ví dụ tại những đám mây ở góc trên bên trái để thấy sự khác biệt.
Lưu ý rằng ảnh JPEG được tải từ tài nguyên dự án và được vẽ theo cách tương tự hiển thị tốt, tức là không có pixelation.
Ai có thể cho tôi gợi ý là tại sao điều này xảy ra?
Để xây dựng một chút, mảng byte được lấy từ Flickr như sau; điều này dựa trên mã từ ứng dụng Photostream của 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: Tôi cũng đã đăng một biến thể của câu hỏi này trên nhóm android.developer Google.
Cảm ơn rất nhiều vì đề xuất của bạn - bây giờ tôi thực sự bối rối! Tôi đã làm như bạn đề nghị và thấy rằng hình ảnh kết quả trực tiếp từ mảng byte tải xuống thực sự là pixelated. Tuy nhiên, điều này được tải xuống từ chính xác cùng một URL, khi được truy cập trên máy tính của tôi, KHÔNG được pixelated. Dưới đây là URL Flickr tương ứng:
http://farm3.static.flickr.com/2678/4315351421_54e8cdb8e5.jpg
Ngay cả người lạ, khi tôi chạy cùng một ứng dụng trong mô phỏng hơn là trên điện thoại của tôi (một HTC Hero), không có pixelation.
Làm thế nào trên trái đất này có thể?
Dưới đây là đoạn code tôi sử dụng cho tải một bitmap từ một URL - nó được dựa trên các ứng dụng Photostream Romain Guy, và nó kết hợp đề nghị Will viết mảng byte liệu sang file:
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);
}
}
}
Tôi có phát điên ở đây không? Tốt nhất, Michael.
Tôi lấy tự do nội tuyến hình ảnh, vì điều đó thường khiến câu hỏi đẹp hơn và dễ đọc hơn. – unwind
Bạn đã bao giờ tìm cách giải quyết vấn đề này chưa? Tôi đã thử các đề xuất, nhưng không may mắn. Đó là siêu gây phiền nhiễu. – blork
dưới dạng chú thích cuối trang, đừng quên rằng JPEG không mất dữ liệu trong môi trường Android. mặc dù nó được hỗ trợ nhưng nó không được khuyến khích sử dụng PNG. – user836725