使用像素阵列在SFML中处理图像

| 嘿,所以我试图制作一个接受图像反射和sf :: IntRect的函数 (这有4个整数,分别代表矩形的顶部,底部,左侧和右侧。此矩形代表所显示图像的一部分,但实际上并未切除矩形外部的像素) 然后通过切除IntRect外部的像素来创建新的压缩图像。我想我能做到这一点的唯一方法是制作一个尺寸与IntRect相同的2d像素阵列,然后通过遍历图像来填充它,但是由于我不知道IntRect的尺寸,我可以做一个常数数组...... 这个问题不断出现,我认为要进行大量的向量工作,而对c_style数组的折衷会花费很多性能。 是否有一些简单的解决方案来大量操作/更改图像的尺寸和颜色?     
已邀请:
        存储和访问二维图像(或具有可变大小的任何二维矩阵)的通常方法是分配适当大小(
width * height
(width + padding) * height
)的一维数组,然后将索引计算到数组中。手动\”(
y * stride + x
,其中
stride
width + padding
)。 (我通常对那个一维数组使用
std::vector
,但这是另一回事了) 引用2D图像数据的常规方法(引用与按引用传递一样)是传递一个元组:
void* imageData
-左上像素的地址
size_t stride
-要加到
imageData
下一行的字节数
size_t width
size_t height
SomeEnum pixelFormat
-图像的像素格式(如果只有一个,则可以省略) 当然,如果只有一种像素格式,则可以使用类型化的指针,并以该类型为单位(而不是字节)指定ѭ3。 使用这样的参考,您可以非常轻松高效地循环访问像素:
size_t const bytesPerPixel = GetBytesPerPixel(ref->pixelFormat);

for (size_t y = 0; y < ref->height; y++)
{
    unsigned char* currentLine =
        static_cast<unsigned char*>(ref->imageData) + ref->stride * y;

    for (size_t x = 0; x < ref->width; x++)
    {
        // any modern compiler will optimize the multiplication below to
        // an incremental addition
        unsigned char* currentPixel = currentLine + bytesPerPixel * y;

        // do something to the pixel data at
        // currentPixel[0] ... currentPixel[bytesPerPixel - 1]
    }
}
通过这种方式传递图像引用的好处是,您始终可以“调整”这样的引用以指向原始图像的子矩形。您只需要相应地调整值:将
imageData
指向子矩形的左上像素,并将
width
height
设置到子矩形的宽度和高度。
stride
保持不变。 这意味着您不必“具体化”裁剪后的图像,只需将对任何功能的子矩形的引用传递给它,该子矩形就可以像在\“上一样在该子矩形上运行”完整的”图像。 而且,如果您真的想“实现”裁剪后的图像,那么您现在也应该有足够的信息来做到这一点。至少我希望如此:) 编辑:由于您对sf :: IntRect部分非常明确,但是只写了\“ image \”而不是sf :: Image,所以我假设您是在谈论自己管理的事情,而不是sf :: Image。好... 如果仅要将sf :: Image的子矩形复制到另一个sf :: Image,则可以执行以下操作:
sf::Image sourceImage = ...;
sf::IntRect subRect = ...;

// construct an empty sf::Image with the appropriate dimensions
sf::Image newImage(subRect.GetWidth(), subRect.GetHeight());

// copy the pixel data into the new image
newImage.Copy(sourceImage, 0, 0, subRect);
    

要回复问题请先登录注册