Я пытаюсь декодировать InputStream для растрового изображения, код настолько прост:андроид BitmapFactory.decodeStream низкое качество
Bitmap myBitmap = BitmapFactory.decodeStream(myStream);
НО качество outputed растрового изображения является слишком низким (иногда, а иногда качество хорошее).
также источник изображения хорошего качества.
я пытался играть с опциями Bitmap, но ничего не изменилось:
BitmapFactory.Options options = new BitmapFactory.Options();
options.inScaled = false;
options.inDither = false;
options.inPreferredConfig = Bitmap.Config.ARGB_8888;
Bitmap myBitmap = BitmapFactory.decodeStream(myStream, null, options);
так, как я могу получить полное качество растрового изображения?
Update 1:
Я использую эту картинку для анимации, как показано ниже:
coverAnimationImage.post(new Runnable()
{
Override
public void run()
{
try
{
InputStream coverStream = getCoverStream();
if(coverStream != null)
{
bookCover = BitmapFactory.decodeStream(coverStream);
}
}
catch (Exception e)
{
// no cover
}
coverAnimationImage.setImageBitmap(bookCover);
mBackground = new ColorDrawable(Color.BLACK);
if(Build.VERSION.SDK_INT >= 16)
{
coverAnimationLayout.setBackground(mBackground);
}
else
{
coverAnimationLayout.setBackgroundDrawable(mBackground);
}
if (flag)
{
ViewTreeObserver observer = coverAnimationImage.getViewTreeObserver();
observer.addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener()
{
@Override
public boolean onPreDraw()
{
coverAnimationImage.getViewTreeObserver().removeOnPreDrawListener(this);
int[] screenLocation = new int[2];
coverAnimationImage.getLocationOnScreen(screenLocation);
mLeftDelta = coverLeft - (screenLocation[0]);
mTopDelta = coverTop - (screenLocation[1]);
mWidthScale = (float) coverWidth/coverAnimationImage.getWidth();
mHeightScale = (float) coverHeight/coverAnimationImage.getHeight();
runEnterAnimation();
return true;
}
});
}
}
});
Я думаю, когда я бегу анимации BitmapFactory.decodeStream
не закончил его работу! Является ли это возможным? или любая идея, что здесь происходит?
Обновление 2: информационное изображение
Обновление 3:
низкое качество изображения:
высокого качества:
монитор памяти:
YouTube Видео:
android BitmapFactory.decodeStream low quality
Update 4:
код getCoverStream
:
protected InputStream getCoverStream()
{
String fileName = getCoverAddress();
InputStream in = null;
ZipEntry containerEntry = mZip.getEntry(fileName);
if (containerEntry != null)
{
try
{
in = mZip.getInputStream(containerEntry);
}
catch (IOException e)
{
Log.e(TAG, "Error reading zip file " + fileName, e);
}
}
if (in == null)
{
Log.e(TAG, "Unable to find file in zip: " + fileName);
}
return in;
}
Стандартный подход должен работать ... DecodeStream будет декодировать полнофункциональную графику по умолчанию , Мне интересно, правильно ли настроены ваши папки ресурсов. Например, если вы разместите высококачественную графику в папке «ldpi» и низкокачественную графику в папке «xxhdpi», среда может подумать, что она выбирает высококачественную графику, но заканчивает вывод изображения низкого качества. Возможно, мы могли бы лучше помочь, если бы вы сказали нам, что разрешения изображений используются в каждой из папок активов? (ldpi/mdpi/hdpi/xhdpi/xxhdpi) – 1owk3y
@ 1owk3y Изображение, которое я использовал для декодирования, не находится в доступных папках. изображение, извлеченное как поток из книги эпоса. я вижу, что изображение имеет хорошую qality. – mehdok
Является ли образ прогрессивным? Возможно, он останавливается только после того, как получит первый прогон пробы (низкое качество). Попробуйте не прогрессивное изображение? (просто исключая возможность, прежде чем мы копаем дальше). Если использование непрогрессивного изображения устраняет проблему, то вы узнаете, что она останавливается после первого прохода (и может найти, как сообщить Android, как не останавливаться после первого прохода. Извините, я посмотрел бы это прямо сейчас но я в пути) – 1owk3y