使用像素阵列在SFML中操作图像
Manipulate Images in SFML using Pixel Arrays
嘿,我正在尝试制作一个函数,该函数接受图像引用和sf::IntRect
(这有4个int表示矩形的顶部、底部、左侧和右侧。此矩形表示正在显示的图像部分,但实际上并没有切断矩形外的像素)
然后通过剪切IntRect外部的像素来创建新的压缩图像。我想我能做到这一点的唯一方法是制作一个与IntRect尺寸相同的二维像素阵列,然后通过迭代图像来填充它,但由于我不知道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
——图像的像素格式(如果只有一个,可以省略)
当然,如果只有一种像素格式,则可以使用键入的指针,并以该类型的单位(而不是字节)指定stride
。
使用这样的参考,你可以很容易地、非常高效地访问循环中的像素:
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
设置为子矩形的宽度和高度。CCD_ 17保持不变。
这意味着你不必"具体化"裁剪后的图像,你只需将对子矩形的引用传递给任何函数,它就会像对"完整"图像一样对该子矩形进行操作。
如果你真的想"具体化"一张裁剪过的图像,你现在也应该有足够的信息来做到这一点。至少我希望如此:)
编辑:因为你对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);
- 为什么在popback()操作之后,它仍然打印完整的矢量
- 在单击QT中单击图像时,尝试立即显示用户编辑操作的结果
- 在RGB图像上执行阈值操作
- 在不使用缓冲区的情况下对2个图像进行操作(加法、减法等)
- C++使用逐位操作从图像中提取字符
- 图像操作2个图像之间的差异
- 是否可以仅使用位操作有效地完成图像屏蔽
- 解密不适用于保存的图像,但适用于图像的像素操作矩阵
- 在C++中读取/操作图像
- 如何使用SFML操作图像
- 我们可以在不使用 c++ 中的任何库的情况下加载、显示和操作图像的矩阵吗?
- OpenCV Mat::data在图像操作后为零
- 如何在MITK中访问图像属性列表和操作
- 使用像素阵列在SFML中操作图像
- 无法对使用imshow可以看到的图像执行imwrite操作
- OpenCV:对RGB图像应用操作(拆分+合并)
- 如何在C++中操作/旋转 JPEG 图像
- 通过图像指针进行窗口操作
- c++, opencv:在过滤操作中对源和目标图像使用相同的Mat是否安全?
- 用linux操作内存中的位图图像