يفشل وحدة فك ترميز Skia في فك تشفير الدفق البعيد
سؤال
أحاول فتح دفق بعيد لصورة JPEG وتحويله إلى كائن نقطية:
BitmapFactory.decodeStream(
new URL("http://some.url.to/source/image.jpg")
.openStream());
يعيد وحدة فك الترميز خالية وفي السجلات أحصل على الرسالة التالية:
DEBUG/skia(xxxx): --- decoder->decode returned false
ملحوظة:
1. طول المحتوى غير صفري ونوع المحتوى image/jpeg
2. عندما أفتح عنوان URL في المتصفح ، يمكنني رؤية الصورة.
ما الذي أفتقده هنا؟
الرجاء المساعدة. شكرًا.
المحلول 2
يبدو أن هناك بعض المشكلات في الدفق والطريقة التي تعامل بها Android. التصحيح في هذا تقرير الشوائب حل المشكلة في الوقت الحالي.
نصائح أخرى
الحل المقدم في Android Bug N ° 6066 تتكون في تجاوز FilterInputStream Std ثم أرسلها إلى BitmapFactory.
static class FlushedInputStream extends FilterInputStream {
public FlushedInputStream(InputStream inputStream) {
super(inputStream);
}
@Override
public long skip(long n) throws IOException {
long totalBytesSkipped = 0L;
while (totalBytesSkipped < n) {
long bytesSkipped = in.skip(n - totalBytesSkipped);
if (bytesSkipped == 0L) {
int byteValue = read();
if (byteValue < 0) {
break; // we reached EOF
} else {
bytesSkipped = 1; // we read one byte
}
}
totalBytesSkipped += bytesSkipped;
}
return totalBytesSkipped;
}
}
ثم استخدم وظيفة decodestream:
Bitmap bitmap = BitmapFactory.decodeStream(new FlushedInputStream(inputStream));
الحل الآخر الذي وجدته هو ببساطة إعطاء bufferedInputStream إلى th bitmapfactory:
Bitmap bitmap = BitmapFactory.decodeStream(new BufferedInputStream(inputStream));
يجب أن يقوم هذان الحلان بالخدعة.
يمكن العثور على مزيد من المعلومات في تعليقات تقرير الأخطاء: Android Bug No.6066
بالنسبة لي المشكلة هي نوع لون الصورة: صورتك على اللون = cymk ليس في RGB
لقد وجدت مكتبة ، يمكنها فتح الصور التي تفشل فيها Android Skia. يمكن أن يكون مفيدًا لبعض الأوعية الدموية:
https://github.com/suckgamony/rapidDecoder
بالنسبة لي ، فقد حل المشكلة لأنني لا أقوم بتحميل العديد من الصور في وقت واحد ، والكثير من الصور التي أقوم بتحميلها لها ملف تعريف ICC. لم أحاول دمجها مع بعض المكتبات الشائعة مثل Picasso أو Glide.