【发布时间】:2015-07-21 04:21:05
【问题描述】:
我正在尝试将输入流解码为位图,代码非常简单:
Bitmap myBitmap = BitmapFactory.decodeStream(myStream);
但是输出的位图质量太低(有时,有时质量很好)。
来源的图像质量也很好。
我尝试使用位图选项,但没有任何改变:
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);
那么,我怎样才能获得完整质量的位图?
更新 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
更新 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 我用来解码的图像不在可绘制文件夹中。从 epub 书籍中提取为流的图像。我可以看到图像质量很好。
-
图像是“渐进式”的吗?也许它只是在获得第一个样本通过时才停止(低质量)。尝试非渐进式图像? (只是在我们进一步挖掘之前消除了这种可能性)。如果使用非渐进式图像解决了问题,那么您会知道它在第一次通过后停止(并且可以找到如何告诉 Android 如何在第一次通过后不停止。抱歉,我现在自己查一下但我在途中)
-
@1owk3y,好的,图像是
png,我用 exiftool http://www.sno.phy.queensu.ca/~phil/exiftool/ 对其进行了测试,并将结果发布到原始问题。问题是质量是随机的,假设我第一次运行代码质量低,第四次质量好。 -
@1owk3y ,好吧,我已经按照你说的做了,我看到有时
getCoverStream根本不会打电话,结果质量很低,问题是我通过封面预览作为除了第二个活动之外,有时活动使用该预览进行动画。你真的帮我找到了原来的问题,所以我想给你赏金。只要发布一个答案,我就会这样做。