【发布时间】:2019-03-20 23:20:30
【问题描述】:
我试图创建一个函数来转置 就地位图。但是到目前为止,我得到的结果都是一团糟,我找不到我做错了什么。
源位图是 ARGB 格式的一维像素阵列。
void transpose(uint8_t* buffer, const uint32_t width, const uint32_t height)
{
const size_t stride = width * sizeof(uint32_t);
for (uint32_t i = 0; i < height; i++)
{
uint32_t* row = (uint32_t*)(buffer + (stride * i));
uint8_t* section = buffer + (i * sizeof(uint32_t));
for (uint32_t j = i + 1; j < height; j++)
{
const uint32_t tmp = row[j];
row[j] = *((uint32_t*)(section + (stride * j)));
*((uint32_t*)(section + (stride * j))) = tmp;
}
}
}
更新:
为了澄清和避免混淆,因为似乎有些人认为这只是一个旋转图像问题。 转置图像由 2 个变换组成:1) 水平翻转 2) 逆时针旋转 90。 (如图片示例所示,查看箭头方向)
【问题讨论】:
-
你的例子有
height != widht,所以不太清楚你的意思是就地 -
就地我的意思是不将结果复制到不同的位图中,也不分配与源具有相同尺寸的临时工作缓冲区。所以,直接转换输入位图缓冲区。
-
最好将每个像素的地址计算拆分为一个小的内联函数,以减少正在进行的数学运算
-
我收回我之前关于 stride 的评论,你在 uint32_t* 和 uint8_t* 之间来回切换让我感到困惑
标签: c++ bitmap transpose in-place