Я предполагаю, что вы хотите применить фильтр свертки.
Для начала вы, вероятно, захотите использовать Bitmap вместо изображения, т.е. new Bitmap(Path)
.
Тривиальный метод будет быть l oop по каждому пикселю, а затем l oop по каждому значению в фильтре и умножать / накапливать с соответствующими значениями пикселей. Использование GetPixel для получения значений пикселей. Обратите внимание, что вам нужно как-то обрабатывать границы изображения, например, пропуская их. GetPixel
, как известно, медленный, но я бы рекомендовал использовать его, чтобы убедиться, что код прибит перед оптимизацией.
Примерно так (непроверено):
var bmp = new Bitmap(@"test.bmp");
var filter = new float[3, 3];
var result = new Bitmap(bmp.Width - 2, bmp.Height - 2);
for(int y = 1; y < bmp.Height-1; y++)
{
for (int x = 1; x < bmp.Width - 1; x++)
{
float r = 0;
r += bmp.GetPixel(x-1, y-1).R * filter[0, 0];
r += bmp.GetPixel(x , y-1).R * filter[1, 0];
r += bmp.GetPixel(x+1, y-1).R * filter[2, 0];
r += bmp.GetPixel(x-1, y ).R * filter[0, 1];
r += bmp.GetPixel(x , y ).R * filter[1, 1];
r += bmp.GetPixel(x+1, y ).R * filter[2, 1];
r += bmp.GetPixel(x-1, y+1).R * filter[0, 2];
r += bmp.GetPixel(x , y+1).R * filter[1, 2];
r += bmp.GetPixel(x+1, y+1).R * filter[2, 2];
// Repeat for G & B channels
result.SetPixel(x-1, y-1, Color.FromArgb((int)r, 0, 0));
}
}
A более подробное руководство можно найти здесь .