ImageStride(内存图像⾏跨度)
ImageStride(内存图像⾏跨度)
当视频图像存储在内存时,图像的每⼀⾏末尾也许包含⼀些扩展的内容,这些扩展的内容只影响图像如何存储在内存中,但是不影响图像如
何显⽰出来;
Stride就是这些扩展内容的名称,Stride也被称作Pitch,如果图像的每⼀⾏像素末尾拥有扩展内容,Stride的值⼀定⼤于图像的宽度值,就
像下图所⽰:
间距为什么出现?这个参数看起来似乎没什么⽤,因为它的值和图像的宽度⼀样。但是那是⼤多数情况下,⼀旦遇到它和宽度不⼀样的时
候,如果你不了解它的含义,那么程序肯定要出问题。可是为什么有时候它等于宽度,有时候⼜不等于呢?这就和它的含义有关了。
我们都知道现在计算机的cpu都是32位或者64位的cpu,他们⼀次最少读取4、8个字节,如果少于这些,反⽽要做⼀些额外的⼯作,会花更
长的时间。所有会有⼀个概念叫做内存对齐,将结构体的长度设为4、8的倍数。
间距也是因为同样的理由出现的。因为图像的操作通常按⾏操作的,如果图像的所有数据都紧密排列,那么会发⽣⾮常多次的读取⾮对齐内
存。会影响效率。⽽图像的处理本就是⼀个分秒必争的操作,所以为了性能的提⾼就引⼊了间距这个概念。间距就是指图像中的⼀⾏图像数
据所占的存储空间的长度,它是⼀个⼤于等于图像宽度的内存对齐的长度。这样每次以⾏为基准读取数据的时候就能内存对齐,虽然可能会
有⼀点内存浪费,但是在内存充裕的今天已经⽆所谓了。
两个缓冲区包含同样⼤⼩(宽度和⾼度)的视频帧,却不⼀定拥有同样的Stride值,如果你处理⼀个视频帧,你必须在计算的时候把Stride
考虑进去;
另外,⼀张图像在内存中有两种不同的存储序列(arranged),对于⼀个从上⽽下存储(Top-Down)的图像,最顶⾏的像素保存在内存中
最开头的部分,对于⼀张从下⽽上存储(Bottom-Up)的图像,最后⼀⾏的像素保存在内存中最开头的部分,下⾯图⽰展⽰了这两种况:
⼀张从下⽽上的图像拥有⼀个负的Stride值,因为Stride被定义为[从⼀⾏像素移动到下⼀⾏像素时需要跨过多少个像素],仅相对于被显⽰
出来的图像⽽⾔;⽽YUV图像永远都是从上⽽下表⽰的,以及任何包含在Direct3DSurface中的图像必须是从上⽽下,RGB图像保存在系
统内存时通常是从下⽽上;
尤其是视频变换,特别需要处理不同Stride值的图像,因为输⼊缓冲也许与输出缓冲不匹配,举个例⼦,假设你想要将源图像转换并且将结
果写⼊到⽬标图像,假设两个图像拥有相同的宽度和⾼度,但是其像素格式与Stride值也许不同;
下⾯代码演⽰了⼀种通⽤⽅法来编写这种功能,这段代码并不完整,因为这只是⼀个抽象的算法,没有完全考虑到真实需求中的所有细节;
这个函数需要六个参数:
1.⽬标图像的起始扫描⾏的内存指针
2.⽬标图像的Stride值
3.源图像的起始扫描⾏的内存指针
4.源图像的Stride值
5.图像的宽度值(以像素为单位)
6.图像的⾼度值(以像素为单位)
这⾥的要点是如何⼀次处理⼀⾏像素,遍历⼀⾏⾥⾯的每⼀个像素,假设源像素类型与⽬标像素类型各⾃在像素的层⾯上已经结构化来表⽰
⼀个源图像与⽬标图像的像素,(举个例⼦,32位RGB像素使⽤RGBQUAD结构体,并不是每⼀种像素类型都有预定义结构体的)强制
转换数组指针到这样的结构体指针,可以⽅便你直接读写每⼀个像素的RGB或者YUV值,在每⼀⾏的开头,这个函数保存了⼀个指向这
⾏像素的指针,函数的最后⼀⾏,通过图像的Stride值直接将指针跳转到图像的下⼀⾏像素的起始点;
本文发布于:2022-12-27 03:45:51,感谢您对本站的认可!
本文链接:http://www.wtabcd.cn/fanwen/fan/90/37901.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |