Коррекция изображения на с#
Подскажите, каким образом можно взаимодействовать с пикселями изображения Bitmap?
Суть задачи в коррекции бочкообразных искажений. Есть алгоритм, который меняет положение пикселей изображения вдоль горизонтальной оси:
public static int[] correction(int[] pixels, int width, int height)
{
//int[] pixels = new int[width * height];
int[] pixelsCopy = (int[])pixels.Clone();
double paramA = -0.007715; // влияет только на крайние пиксели изображения
double paramB = 0.026731; // наиболее сильно влияющий на конечный результат параметр
double paramC = 0.0; // наиболее равномерная коррекция
double paramD = 1.0 - paramA - paramB - paramC; // описывает линейное масштабирование изображени
// Алгоритм исправления
for (int x = 0; x < width; x++)
{
for (int y = 0; y < height; y++)
{
int d = Math.Min(width, height) / 2; // радиус круга, вписанного в изображения
// центр изображения
double centerX = (width - 1) / 2.0;
double centerY = (height - 1) / 2.0;
// декартовы координаты точки назначения, относительно центра изображения
double deltaX = (x - centerX) / d;
double deltaY = (y - centerY) / d;
// расстояние или радиус изображения
double dstR = Math.Sqrt(deltaX * deltaX + deltaY * deltaY);
// радиус изображения с использованием полинома
double srcR = (paramA * dstR * dstR * dstR + paramB * dstR * dstR + paramC * dstR + paramD) * dstR;
// сравнение старого и нового расстояния, чтобы получить коэффициент
double factor = Math.Abs(dstR / srcR);
// координаты в исходном изображении
double srcXd = centerX + (deltaX * factor * d);
double srcYd = centerY + (deltaY * factor * d);
// ближайшая точка, без интерполяции
int srcX = (int)srcXd;
int srcY = (int)srcYd;
if (srcX >= 0 && srcY >= 0 && srcX < width && srcY < height)
{
int dstPos = y * width + x;
pixels[dstPos] = pixelsCopy[srcY * width + srcX];
}
}
}
return pixels;
}
Я загрузил новое изображение при помощи Bitmap, создал пустое изображение и записал в него цвета основного:
Bitmap sourceImage1 = (Bitmap)Image.FromFile(@"C:\Users\user\Desktop\dstView2.jpg");
Bitmap targetImage1 = new Bitmap(sourceImage1.Width, sourceImage1.Height, sourceImage1.PixelFormat);
for (int x = 0; x < targetImage1.Width; x++)
{
for (int y = 0; y < targetImage1.Height; y++)
{
Color imageColor = sourceImage1.GetPixel(x, y);
Color newColor = Color.FromArgb(imageColor.A, imageColor.R, imageColor.G, imageColor.B); //хранит цвет изображения
targetImage1.SetPixel(x, y, newColor);
}
}
Что нужно делать дальше? Новое изображение хранит цвета пикселей исходного, но как менять сами координаты пикселей непонятно.
Заранее спасибо!