stride 参数

当前的任务是在一些处理图像原始数据的接口添加 stride 参数
目前需要处理的接口如下

  • from_pixels
  • from_pixels_resize
  • to_pixels
  • to_pixels_resize

这些接口是将输入图像根据其 type 参数从一个颜色空间转换到另一个颜色空间,同时做些 resize 的处理。

stride 参数的含义

这个参数表示每行的数据长度(单位字节,包含无效数据), 与像素类型无关。
上面这些接口的参数中都会有 widthheight 表示输入图像的每行每列的像素个数,由于图像以像素矩阵,行优先的格式排布在内存中,所以每当一行像素结束时应当紧接下一行像素。
但是有时对数据的排布会有特殊的要求,比如数据对齐等,这是为了迎合数据对齐要求就会在一行像素末尾添加若干无效的字节。此时每行像素之间便不是紧密排布,stride 参数就是表示一行实际所占的字节数

如果 (通常一个像素占四个字节, 取决于图像深度和颜色空间类型),那么说明图像中没有无效字节直接处理即可,转换时也无需考虑 stride 参数。如果不等(), 那么这是使用一些接口时就要注意图像中包含无效字节的问题。

一些想法

原先这些接口都没有 stride 参数,底层 from_*2* 这些接口都将输入图像视为不包含无效数据,在接口中增加该参数需要改变底层数据处理的实现。

参考 libyuv 的实现,其中是将每行像素的处理单独作为一个接口实现,这样将解耦之后就可以很灵活的加入 stride 参数。这样的实现扩展性很好,无需其他的性能上的开销,目前项目中还没有单独处理一行的接口,手动实现的话怕是要花不少时间。
但是在工程中尽量少自己造轮子,尽可能多的复用当前的接口((¦3」∠)),实现最快而且 bug 最少。实际上看到需求就可以得出一个很直观需要消耗额外内存的方法,就是将其原始图像的有效数据拷贝到新的空间使得其每行像素紧密排列,再复用原始的接口即可,(~ ̄(OO) ̄)ブ。

to_pixels 接口就是 from_pixels 接口的逆操作,生成图像之后再在每行末尾添加无效字节好了。

  • 搭建测试工程,验证代码正确性。