x & 0xfffffe 是什么意思?
What does x & 0xfffffe mean?
在自定义 YUV 到 RGBA Renderscript 中,我发现了以下我无法理解的行:
int baseUYIndex = numTotalPixels + (y >> 1) * wIn + (x & 0xfffffe);
numTotalPixels
是宽*高。没关系。
y>>1
。他们为什么这样做?
x & 0xfffffe
。他们为什么这样做?
我之所以问,是因为我必须先了解转换。在下一步中,我想将 Y、U 和 V 组件旋转 90 度。我向 here 寻求帮助,但没有人能提供帮助。所以,我决定自己做。
查看 linked 代码中的注释,您可以看到此例程适用于一种特定类型的 YUV:具有色度子采样的 YUV。
// YUV 4:2:0 planar image, with 8 bit Y samples, followed by
// interleaved V/U plane with 8bit 2x2 subsampled chroma samples
这意味着 "color" (U/V) 个字节少于 "luminance" (Y) 个字节。具体来说,原图中一个由4个像素组成的正方形,只会被一个"U"和一个"V"覆盖。 (不过它会有 4 个 Y。)U 和 V 交错成一个单独的 "plane",它跟随 Y 平面。 Here 是一个 link,更详细地描述了相同的排列。
另请参阅维基媒体上的 this 图片(注意:linked 图片的图片格式略有不同,其中 U 和 V 没有交错)。
代码分析
有问题的代码采用原始图像的 (x,y) 坐标,并计算 U/V 分量的数组偏移量。 (Y 分量的数组偏移很简单;它只是 x + y * wIn
)。每个U/V对对应原图中一个4像素的正方形;这意味着每个 U/V 对覆盖 2 个相邻行中的像素。
y >> 1
这条线有效地将 y
除以 2,这为 U/V 平面 提供了正确的行号 。乘以 wIn
(这是图片的宽度),您就得到了 U/V 平面中与您的像素相对应的 U/V 行开头的字节偏移量。
x & 0xfffffe
这相当于x - (x % 2)
。换句话说,我们正在使 x
均匀。这是为了计算 U/V 对的 U/V 行的偏移量。由于每个 U/V 都是一个双字节对,我们总是希望以该对的第一个元素结束:在本例中为 A "U"。
从这段代码可以看出,
uchar _u = rsGetElementAt_uchar(inputAllocation, baseUYIndex);
uchar _v = rsGetElementAt_uchar(inputAllocation, baseUYIndex + 1);
U来自计算偏移量处的字节; V,从下一个字节开始。
在那里,你有你的色度。
在自定义 YUV 到 RGBA Renderscript 中,我发现了以下我无法理解的行:
int baseUYIndex = numTotalPixels + (y >> 1) * wIn + (x & 0xfffffe);
numTotalPixels
是宽*高。没关系。y>>1
。他们为什么这样做?x & 0xfffffe
。他们为什么这样做?
我之所以问,是因为我必须先了解转换。在下一步中,我想将 Y、U 和 V 组件旋转 90 度。我向 here 寻求帮助,但没有人能提供帮助。所以,我决定自己做。
查看 linked 代码中的注释,您可以看到此例程适用于一种特定类型的 YUV:具有色度子采样的 YUV。
// YUV 4:2:0 planar image, with 8 bit Y samples, followed by // interleaved V/U plane with 8bit 2x2 subsampled chroma samples
这意味着 "color" (U/V) 个字节少于 "luminance" (Y) 个字节。具体来说,原图中一个由4个像素组成的正方形,只会被一个"U"和一个"V"覆盖。 (不过它会有 4 个 Y。)U 和 V 交错成一个单独的 "plane",它跟随 Y 平面。 Here 是一个 link,更详细地描述了相同的排列。
另请参阅维基媒体上的 this 图片(注意:linked 图片的图片格式略有不同,其中 U 和 V 没有交错)。
代码分析
有问题的代码采用原始图像的 (x,y) 坐标,并计算 U/V 分量的数组偏移量。 (Y 分量的数组偏移很简单;它只是 x + y * wIn
)。每个U/V对对应原图中一个4像素的正方形;这意味着每个 U/V 对覆盖 2 个相邻行中的像素。
y >> 1
这条线有效地将 y
除以 2,这为 U/V 平面 提供了正确的行号 。乘以 wIn
(这是图片的宽度),您就得到了 U/V 平面中与您的像素相对应的 U/V 行开头的字节偏移量。
x & 0xfffffe
这相当于x - (x % 2)
。换句话说,我们正在使 x
均匀。这是为了计算 U/V 对的 U/V 行的偏移量。由于每个 U/V 都是一个双字节对,我们总是希望以该对的第一个元素结束:在本例中为 A "U"。
从这段代码可以看出,
uchar _u = rsGetElementAt_uchar(inputAllocation, baseUYIndex);
uchar _v = rsGetElementAt_uchar(inputAllocation, baseUYIndex + 1);
U来自计算偏移量处的字节; V,从下一个字节开始。
在那里,你有你的色度。