旋转存储在1D阵列中的位图

时间:2014-12-05 12:55:53

标签: c# arrays bitmap

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

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

图像为320 x 240像素并存储在一维阵列中(前320个值代表位图中的第一行,下一个320代表下一行,依此类推)。

我不想将它写入writeablebitmap,将其旋转并将其转换为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];

2 个答案:

答案 0 :(得分:0)

x - 来源。 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];
            }

答案 1 :(得分:-1)

这就是答案。这是我原来的问题作为一个例子,但我认为它已被打破,但事实证明,实际问题在于位图图像尺寸,而不是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];