问题描述
我正在处理100×125尺寸的表情符号图像。为了测试我们的算法对于具有不同参数的图像是否正确工作,我被要求修改图像的步幅。例如。 “生成跨度设置为132的测试数据文件,并查看算法是否适用于该数据。”
有很多工具可以修改图像文件的宽度/高度,但是我找不到能改变步幅的软件。
我理解步幅的方式是,如果图像的宽度W为125像素,高度H为100像素,则其步幅S可能为128像素,并且可以将其存储在RAM存储器中,作为数组S * H * sizeof(padded pixel)
个字节。
将映像另存为光盘时,跨度会怎样??让我们以PNG格式为例。
跨度是否也作为参数与每行额外的S-W像素一起存储在文件中?还是仅仅是将图像文件读入RAM存储器的库的实现细节?
解决方法
跨度是对图像在内存中的布局方式的部分描述。它指定某些元素之间的距离。
以100行125列的图像为例。假设每个像素为四个字节,类型为Pixel
。我们可以将该图像存储在声明为Pixel A[100][125]
的数组中。那么,行中元素之间的跨度为4个字节,列中元素之间的跨度为125•4字节= 500字节。
我们还将将此图像存储在声明为Pixel B[100][128]
的数组中。每行中多余的三个元素将被浪费,但是具有这些尺寸的阵列可能可以对齐以便更轻松地与某些硬件功能一起使用。在此数组中,行中元素之间的跨度仍为四个字节,但列中元素之间的跨度为128•4字节= 512字节。
另一种选择是我们将图像存储在声明为Pixel C[100][125][4]
的数组中,该图像的所有像素都在C[i][j][0]
中,而其他三幅图像的像素都存储在C[i][j][1]
中,C[i][j][2]
和C[i][j][3]
。图像的这种散布存储可能有助于某些并行处理。在此数组中,行中元素之间的跨度为4•4字节= 16字节,列中元素之间的跨度为125•4•4字节= 2000字节。
总而言之,跨步告诉我们数组元素在内存中的位置。如果一列元素之间的跨度为 x 而行元素之间的跨度为 y ,则元素 i , j 位于数组的底部,加上 i • x + j • y 。
要更改图像的跨度,必须重新排列内存中的数据。
(还要注意,有些人可能将跨度称为数字,例如“跨度为2”。这是草率的术语;度量应始终包含单位,因此跨度可能是两个元素或八个字节。有时,该单元隐含在上下文中,但作者应明确说明。)