【问题标题】:Stride calculation for Image format YUY2图像格式 YUY2 的步幅计算
【发布时间】:2014-04-10 05:58:26
【问题描述】:

我正在研究Android的YuvImage.java代码,http://androidxref.com/4.2.2_r1/xref/frameworks/base/graphics/java/android/graphics/YuvImage.java#199

为什么 YUY2 的步幅是宽度*2 而 NV21 的步幅是宽度?

代码如下:

199    private int[] calculateStrides(int width, int format) {
200        int[] strides = null;
201        if (format == ImageFormat.NV21) {
202            strides = new int[] {width, width};
203            return strides;
204        }
205
206        if (format == ImageFormat.YUY2) {
207            strides = new int[] {width * 2};
208            return strides;
209        }
210
211        return strides;
212    }

【问题讨论】:

  • 为什么我读到的代码条件中的肯定是相反的?

标签: android


【解决方案1】:

NV21 格式有两个平面,一个用于亮度,一个用于颜色值。第一个平面的步幅是 width(在数组的第一个元素中找到),第二个平面的步幅是 width(在数组的第二个元素中找到)。所以它是 width 加上 width

在 YUY2 格式中,亮度和颜色信息是交错的,步幅(单个像素行的数据长度)是 width 的两倍(存储在生成的数组)。

【讨论】:

  • 这是否意味着步幅总是大于或等于图像的宽度?如果图片的宽度是奇数或者不是 16 的倍数,stride 会向上取整到最接近的 16 倍数吗?
  • 如果您有一个黑白图像格式,其中每个像素只需要一个位,则步幅将为宽度 / 8,四舍五入到下一个整数。因此,它可以小于宽度,但不适用于 NV21 或 YUY2。我不认为步幅被四舍五入到任何东西的倍数。我从来没有听说过NV21或YUY2有这样的要求。毕竟,每个亮度或颜色值只是一个字节甚至更少。对于 RGBA 和每个像素为 4 字节长的类似格式存在此类舍入规则。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-01-15
  • 2016-11-14
  • 2011-11-20
  • 1970-01-01
  • 1970-01-01
  • 2010-12-02
  • 1970-01-01
相关资源
最近更新 更多