旋转存储在一维数组中的位图



编辑: 第二个代码示例是正确的答案。我的问题不在位图旋转本身之外,所以第二个代码示例是标题中问题的答案。

我正在尝试旋转存储在 1D 数组 (_pixelData( 中的位图。我似乎无法让它工作。有人可以指出我正确的方向或给出一个示例解决方案。

图像为 320

x 240 像素,存储在 1D 数组中(前 320 个值表示位图中的第一行,接下来的 320 个值表示下一行,依此类推(。

我不想把它写到可写位图上,在那里旋转它并将其转换为 int 数组。我想操作 int 数组。这样做的原因是源来自相机作为 ARGB 数据,我想保持简单。

这就是我所拥有的(不起作用。结果是垂直线不相交的破碎图像(

// Rotate the data for Portait Mode
            int height = 320;
            int width = 240;
            int[] _pixelDataRotated = new int[width* height];
            for (int y = 0; y < height; y++)
            {
                for (int x = 0; x < width; x++)
                    _pixelDataRotated[x * height + height - y - 1] = _pixelData[x + y * width];
            }

这就是我的做法,它对旋转也是如此。这就是答案。

    for (int x = 0; x < width; x++)
      for (int y = 0; y < height; y++)
         _pixelDataRotated[y + x * height] = _pixelData[x + y * width];

x - source。y - 死记硬背;

        var x = new[]{1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12};
        var y = new int[12];
        var width = 4;
        var height = 3;
        for (var i = 0; i < width; i++)
            for (var j = 0; j < height; j++)
            {
                y[i * height + j] = x[j * width + i];
            }

这就是答案。这是我最初的问题作为一个例子,但我认为它坏了,但事实证明,实际问题出在位图图像尺寸上,而不是 90 度旋转本身的算法。

// _pixelData is the source array _pixelDataRotated the target array
for (int x = 0; x < width; x++)
  for (int y = 0; y < height; y++)
     _pixelDataRotated[y + x * height] = _pixelData[x + y * width];

最新更新