如何在C#中翻转图像

时间:2015-10-26 01:01:14

标签: c#

我要翻转这张图片, enter image description here

所以看起来像这样, enter image description here

然而,我写的代码使它看起来像这样, enter image description here

我的代码中出错了什么?

    int Height = TransformedPic.GetLength(0);
        int Width = TransformedPic.GetLength(1);

        for (int i = 0; i < Height; i++)
        {
            for (int j = 0; j < Width / 2; j++)
            {
                TransformedPic[i, j] = TransformedPic[i, ((Width) - (j + 1))];
            }
        }

3 个答案:

答案 0 :(得分:2)

当您的代码进入图像的一半时,很可能是第二部分已经使用第一部分进行了更新。

请改为尝试:

    var newPic = TransformedPic.Clone(); // Clone your pic to a new object. 
    int Height = TransformedPic.GetLength(0);
    int Width = TransformedPic.GetLength(1);

    for (int i = 0; i < Height; i++)
    {
        for (int j = 0; j < Width / 2; j++)
        {
            newPic[i, j] = TransformedPic[i, ((Width) - (j + 1))];
        }
    }
    TransformedPic = newPic;

答案 1 :(得分:1)

  1. 您覆盖数据并且丢失了
  2. 你翻错方向
  3. 这应该有效:

            int Height = TransformedPic.GetLength(0);
            int Width = TransformedPic.GetLength(1);
    
            for (int i = 0; i < Height / 2; i++)
            {
                for (int j = 0; j < Width; j++)
                {
                    var tmp = TransformedPic[i, j];
                    TransformedPic[i, j] = TransformedPic[Height - 1 - i, j];
                    TransformedPic[Height - 1 - i, j] = tmp;
                }
            }
    

答案 2 :(得分:1)

如果startend是范围的包含边,那么典型的(易记忆的)翻转(或反向)算法如下:

for (int lo = start, hi = end; lo < hi; lo++, hi--)
    swapelements(lo, hi);

将它应用于您的案例:

首先,一个小帮手方法

static void Swap<T>(ref T x, ref T y)
{
    var temp = x; x = y; y = temp;
}

然后,从

开始
int height = TransformedPic.GetLength(0);
int width = TransformedPic.GetLength(1);

水平翻转

for (int i = 0; i < height; i++)
    for (int lo = 0, hi = width - 1; lo < hi; lo++, hi--)
        Swap(ref TransformedPic[i, lo], ref TransformedPic[i, hi]); 

垂直翻转(如问题所示)

for (int i = 0; i < width; i++)
    for (int lo = 0, hi = height - 1; lo < hi; lo++, hi--)
        Swap(ref TransformedPic[lo, i], ref TransformedPic[hi, i]);

最后,值得一提的是,您可以使用Image.RotateFlip Method来实现相同的目标,而无需将图像像素放入数组缓冲区并进行自己的处理。