图像处理、显示中的行宽(linesize)、步长(stride)、间距(pitch)

在图像数据传输和显示的过程中有一个不常用的参数:间距。

间距的名称:
它有很多的别名,在使用d3d显示的时候,它叫pitch;在用ffmpeg解码的时候,它叫linesize;
在用ffmpeg转换格式的时候,它叫stride。这篇文章中统一以间距来表示。

间距为什么出现:
这个参数看起来似乎没什么用,因为它的值和图像的宽度一样。但是那是大多数情况下,一旦遇到它和宽度不一样的时候,如果你不了解它的含义,那么程序肯定要出问题。可是为什么有时候它等于宽度,有时候又不等于呢?这就和它的含义有关了。
我们都知道现在计算机的cpu都是32位或者64位的cpu,他们一次最少读取4、8个字节,如果少于这些,反而要做一些额外的工作,会花更长的时间。所有会有一个概念叫做内存对齐,将结构体的长度设为4、8的倍数。
间距也是因为同样的理由出现的。因为图像的操作通常按行操作的,如果图像的所有数据都紧密排列,那么会发生非常多次的读取非对齐内存。会影响效率。而图像的处理本就是一个分秒必争的操作,所以为了性能的提高就引入了间距这个概念。

间距的含义:
间距就是指图像中的一行图像数据所占的存储空间的长度,它是一个大于等于图像宽度的内存对齐的长度。这样每次以行为基准读取数据的时候就能内存对齐,虽然可能会有一点内存浪费,但是在内存充裕的今天已经无所谓了。

间距的值:
所以如果图像的宽度如果是内存对齐长度的整数倍,那么间距就会等于宽度,而现在的cpu通常一次读取都是4个字节,而我们通常见到的分辨率都是4的整数倍,所以我们通常发现间距和图像的宽度一样(这里通常指rgb32格式或者以通道表示的yuv420p格式的y通道)。但是如果遇到一些少见的分辨率时间距和图像的宽度就不一样。
还有一种情况是显卡,因为显卡是独立工作的,所以显卡可能和cpu的内存对齐位数是不同的,此时间距就可能和cpu上的有很大差别,例如NVIDA显卡(它的内存对齐位数超大),通常在用d3d显示的时候会用到间距。所以如果你的d3d显示程序在Intel的显卡上显示正常,而在NVIDA显卡上显示不正常,先不要怀疑显卡驱动,先看看你有没有正确处理间距的问题(亲生经历)。

间距的处理:
那么对于间距和宽度不同的时候要如何处理呢?在不同的情况下,处理不同,但是只要把握一个核心—内存对齐,就能理解。

在使用d3d做图像显示的时候,在获取显示内存空间的时候通常会获取到一个参数pitch,就是我们的间距。显卡每次都将pitch长度的数据当做一行。我们将图像数据复制过去得时候要一行一行复制,每次下一行数据的目的起始位置都是上一行的起始位置加上间距。如果是yv12这种通道表示的数据,u、v通道要相应的将行距除2。间距导致的空间内容可以不用置空。
在ffmpeg解码的时候,解码后会获取到一个参数linesize,其实也是间距。从解码后的数据内存中将数据拷贝出来的时候,需要一行一行拷贝,每一行数据的起始位置都是上一行的起始位置加上间距,一行的真正的图像数据长度就是是图像宽度(通道类型要相应除倍数)。
在用ffmpeg进行图像格式转换的时候,需要传入一个参数stride,其实也是间距。只不过这次不需要复杂的处理,只需要知道传入ffmpeg进行转换的图像数据使用的间距,然后传入就行,ffmpeg会自动根据这个值进行相应的处理。

---------------------
作者:太上绝情
来源:CSDN
原文:https://blog.csdn.net/bjrxyz/article/details/52690661
版权声明:本文为博主原创文章,转载请附上博文链接!

posted on 2019-02-19 14:03 明净 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/mingjing/p/10400683.html

图像处理、显示中的行宽(linesize)、步长(stride)、间距(pitch)相关推荐

  1. oracle 设行宽,Oracle设置SQLPlus结果显示的宽度,ORACLE sqlplus提示符设置

    Oracle设置SQLPlus结果显示的宽度,ORACLE sqlplus提示符设置 发布时间:2020-04-03 08:51:02 来源:51CTO 阅读:4392 作者:M_ling 一.SQL ...

  2. Oracle中表pagesize,Oracle 解决显示凌乱串行问题时column、pagesize、linesize的设定

    在查询时经常出现的问题就是,查询的显示结果格式凌乱. 这个主要因为行,页,字段宽度设置不够显示而错位 下面是经常出现的效果: 解决问题方法: SQL> set linesize 1000 SQL ...

  3. xlsx怎么设置行高列宽_Excel2016中调整行高和列宽的两种方法

    在报表的编辑过程中经常需要调整特定行的行高或列的列宽,例如当单元格中输入的数据超出该单元格宽度时,需要调整单元格的列宽.本文图文讲述了Excel2016中调整行高和列宽的两种方法. 方法一:使用命令调 ...

  4. excel表格行宽列高怎么设置_excel怎么调整列宽行高:excel中如何快速调整多行列高和行宽...

    怎样设置使EXCEL,单元格行高列高锁定,但可以改字的? 打开菜上的"工具"-"保护"-许用户编辑区域"窗口,"新建"选项,点中& ...

  5. Java黑皮书课后题第8章:*8.26(行排序)用下面的方法实现一个二维数组中的行排序。返回新数组,且原数组保持不变。编写一个测试程序,提示用户输入一个3*3的double型矩阵,显示一个排好的矩阵

    *8.26(行排序)用下面的方法实现一个二维数组中的行排序.返回新数组,且原数组保持不变.编写一个测试程序,提示用户输入一个3*3的double型矩阵,显示一个排好的矩阵 题目 题目描述与运行示例 破 ...

  6. excel2010设置列宽为像素_Excel2010中调整行高和列宽的方法

    Excel2010的默认情况下,Excel中所有行的高度和所有列的宽度都是相等的.可以利用鼠标拖动方式和"格式"列表中的命令来调整Excel的行高和列宽. 1.鼠标拖动法 在对行高 ...

  7. excel中显示隐藏的行_在Excel中显示或隐藏用户提示

    excel中显示隐藏的行 When you set up a worksheet for other people to use, data validation messages can help ...

  8. 如何使用条件格式突出显示Google表格中的行

    Should you need to isolate data in Google Sheets based on specific criteria in a cell, you can use c ...

  9. Microsoft Excel 教程:如何在 Excel 中更改列宽或行高?

    欢迎观看 Microsoft Excel 教程,小编带大家学习 Microsoft Excel 的使用技巧,了解如何在 Excel 中更改列宽或行高. 可以手动调整列宽或行高,或者自动调整列和行的大小 ...

最新文章

  1. adv147(蓝桥杯) 学霸的迷宫 bfs
  2. 如何设计高可用的微服务架构
  3. 如何才能成为真正的程序员
  4. mongodb java spring_[Java教程]Spring 与 mongoDB 整合
  5. 全国计算机python考试难吗_全国计算机二级的难度有多大?
  6. 陕西师范大学计算机学院课表,陕西师范大学数学和信息科学学院课程表.doc
  7. 图机器学习在度小满风控中的应用
  8. python字符大小写字母转换用那个键_python字符串大小写如何转换
  9. c语言编程贪吃蛇的不同功能,贪吃蛇C语言代码实现(难度可选)
  10. 我为什么关注范冰冰和苍井空
  11. Java项目(SpringBoot+MyBatis-Plus):国内新冠肺炎疫情大数据可视化平台+疫情数据后台管理系统
  12. python发送钉钉消息
  13. 品牌 read.php,优网科技高级程序员关于PHP优化知识分享
  14. JScript基本认知
  15. CSS背景图片background如何改变大小以及样式设置
  16. K8s系列之:DNS服务搭建指南
  17. 快速理解深度信念网络
  18. 2.2 zio入门——按顺序组合ZIO
  19. 什么是“蓝牙距离感应装置”
  20. 虚拟机包 OVF和OVA的区别

热门文章

  1. 编译原理复习 第一章 概述
  2. 测试案例(五个案例)
  3. ORACLE MERGE INTO语句,unable to get a stable set of rows in the source tables报错解决
  4. 计算机毕业设计(38)java毕设作品之餐厅座位预订系统
  5. 有赞.测试团队介绍(转)
  6. 大数据的概念、特点及应用场景
  7. Jackson ImmunoResearch普通羊驼血清说明书
  8. html怎么画正方形的斜线,html – 斜线的样式
  9. Docker基础笔记
  10. 渗透中超全的Google hack语法