【问题标题】:Android Color formats (RGB565, ARGB8888)Android 颜色格式(RGB565、ARGB8888)
【发布时间】:2013-02-17 03:31:57
【问题描述】:
    getHolder().setFormat(PixelFormat.RGBA_888);        

    Options options = new BitmapFactory.Options();       
    options.inDither=true;                               
    options.inScaled = true; 
    options.inPreferredConfig = Bitmap.Config.ARGB_8888; 
    options.inPurgeable=true;

(使用上述选项创建的位图)

当使用上面的代码时,我得到以下结果............

  • 我的平板设备上没有色带
  • 在测试手机(三星 Galaxy Ace)上出现明显的色带

    getHolder().setFormat(PixelFormat.RGBA_888);        
    
    Options options = new BitmapFactory.Options();       
    options.inDither=true;                               
    options.inScaled = true; 
    options.inPreferredConfig = Bitmap.Config.ARGB_565; 
    options.inPurgeable=true;
    
  • 我的平板电脑上没有色带

  • Galaxy Ace 上有明显的色带
  • 结果与上面相同

    getHolder().setFormat(PixelFormat.RGB_565);     
    
    Options options = new BitmapFactory.Options();       
    options.inDither=true;                               
    options.inScaled = true; 
    options.inPreferredConfig = Bitmap.Config.RGB_565; 
    options.inPurgeable=true;
    
  • 我的平板电脑上的色带

  • SG Ace 上的色带

    getHolder().setFormat(PixelFormat.RGB_565);     
    
    Options options = new BitmapFactory.Options();       
    options.inDither=true;                               
    options.inScaled = true; 
    options.inPreferredConfig = Bitmap.Config.ARGB_8888; 
    options.inPurgeable=true;
    
  • 我的平板电脑上的色带

  • SG Ace 上的色带

因此,总而言之,似乎只有 PixelFormat.xxxx 部分有所不同。我的理解是,这是设置支架颜色格式。这将影响绘制的所有内容。 (即,一切都将采用这种格式)。

有人能解释一下下面这行的目的是什么吗?

options.inPreferredConfig = Bitmap.Config.xxxxxxx

这似乎对已绘制的位图没有任何影响。

性能是最重要的,所以我可能必须更改我的原始 png 文件,使它们没有渐变,(即,将它们绘制为 RGB565 - 这是可取的还是我应该坚持使用 8888?)或者应该抖动排序出去? (因为如您所见,我启用了它,但似乎没有帮助)。

你知道为什么 Ace 上总是有条带吗?会不会是硬件限制?

谢谢,这一切都非常令人困惑。

(PS 我已经阅读了官方指南,在向 SO 发布问题以及查看其他相关 SO 问题之前,我总是会查看该指南,但官方指南(通常是这种情况)并不清楚这对我来说,我无法通过其他问题找到答案,所以如果它已经在这里道歉)。

【问题讨论】:

    标签: android bitmap rgb bitmapfactory argb


    【解决方案1】:

    565 格式是默认格式,因为它可以更快地绘制并且需要更少的处理能力。至于你的 SG Ace,我相信不久前只有某些版本的 Android 支持 8888 色。

    要让我的应用背景之一不带,我必须执行以下操作:

    1 - 为可绘制文件夹添加背景

    2 - 创建具有以下内容的 background_dithered.xml:

    <?xml version="1.0" encoding="utf-8"?>
    <bitmap xmlns:android="http://schemas.android.com/apk/res/android"
        android:antialias="true"
        android:dither="true"
        android:src="@drawable/background" />
    

    3 - 在活动代码中:

    @Override
    public void onAttachedToWindow() {
            super.onAttachedToWindow();
    
            getWindow().setFormat(PixelFormat.RGBA_8888);
    }       
    

    【讨论】:

    • 啊,这可能解释了 Ace 的问题,您的上述实现是否适用于表面视图? (我正在用 Canvas.drawbitmap 绘制背景) - 谢谢
    • 我不确定,因为我只使用静态 png 执行此操作,但您可以尝试在 onAttachedToWindow 覆盖上设置格式
    • 现在可以肯定 ARGB_8888 是默认值。
    【解决方案2】:

    有人能解释一下下面这行的目的是什么吗?

    options.inPreferredConfig = Bitmap.Config.xxxxxxx

    这似乎对已绘制的位图没有任何影响。

    不同的Bitmap 配置会有不同的内存占用。 RGB_565 是 16 位颜色格式。 ARGB_8888 是 32 位格式。

    无论您选择了哪种getHolder().setFormat(); 配置,或者它是如何绘制的,ARGB_8888 位图都将比RGB_565 格式的位图大得多(在内存中)。

    【讨论】:

    • 谢谢@TylerM,我了解不同的格式和内存大小等,我不明白上面引用的你/我的行的目的。你是说如果我有一个 RGB8888 图像并在 inPreferredConfig 设置为 RGB565 的情况下加载它,它的内存会更小吗?如果是这种情况,当我将持有者设置为 8888 时,为什么它仍然显示没有 bandin(即,以 32 位格式)?对不起,如果这没有意义,但我不明白......谢谢:-/
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-03
    • 2014-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多