我的代码中出错了什么?
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))];
}
}
答案 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)
这应该有效:
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)
如果start
和end
是范围的包含边,那么典型的(易记忆的)翻转(或反向)算法如下:
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来实现相同的目标,而无需将图像像素放入数组缓冲区并进行自己的处理。