如何遍历行对齐像素的子集



我有一个来自PNG的BGRA数据缓冲区,它是行对齐的。

unsigned int *data_; // bgra buffer described by 
// image_.ximage_->width and 
// image_.ximage_->height

我对图像内的子图像采样感兴趣。子图像由一个原点、高度和宽度定义:

struct Box {
unsigned int x_;
unsigned int y_;
unsigned int width_;
unsigned int height_;
};

我像这样遍历子图像::

unsigned int *origin, p;
origin = data_ + ((image_.ximage_->width * box.y_) + box.x_);
for( unsigned int j = 0 ; j < box.height_; ++j )
{
p = origin + (image_.ximage_->width * j);
for( unsigned int i = 0 ; i < box.width_; ++i )
{
p++;
}
}

但不是遍历子图像中的每个像素而是每n个像素遍历一次。例如,在查看这个5x5图像的起始位置为0,0的3x3子图像时,我希望遍历每秒钟像素:

X _ X _ _
_ X _ _ _
X _ X _ _
_ _ _ _ _
_ _ _ _ _

但是我想不出一个好办法。任何想法吗?我必须尽快做这件事。

不经过测试很难说哪个更快或更慢,但是一个平坦的索引可以做到这一点:

for (uint idx = 0; idx<reg.height*reg.width; idx+=step) {
uint i = idx%reg.height + reg.x, j = idx/reg.width + reg.y;
img(i,j) = 'X';
}

可在此测试:https://godbolt.org/z/7jjGWj8rn

最新更新