【问题标题】:android BitmapFactory.decodeStream low qualityandroid BitmapFactory.decodeStream 低质量
【发布时间】: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 根本不会打电话,结果质量很低,问题是我通过封面预览作为除了第二个活动之外,有时活动使用该预览进行动画。你真的帮我找到了原来的问题,所以我想给你赏金。只要发布一个答案,我就会这样做。

标签: android bitmap


【解决方案1】:

BitmapFactory.decodeStream() 实际上可能不是问题,因为 decodeStream 默认解码全分辨率数据。

我们发现您使用的是ZipEntry。这可能是流没有完全下载的问题,或者流 (getCoverStream) 没有被调用。

在 LogCat 中尝试mZip.getSize(); mZip.getCompressedSize(); mZip.getCrc();。不同质量的下载尝试的结果是否会有所不同?我正在尝试确定 zip 下载是否在一段时间后停止、放弃,然后只显示它所拥有的信息等

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-12
    • 1970-01-01
    • 2016-02-09
    • 1970-01-01
    • 1970-01-01
    • 2014-08-10
    • 1970-01-01
    相关资源
    最近更新 更多