Эффективный способ работы с растровыми изображениями в C # - это временная передача в небезопасном режиме (я знаю, что точно не отвечаю на вопрос, но думаю, что OP не удалось использовать Bitmap, так что в любом случае это может быть решением) , Вам просто нужно заблокировать биты, и все готово:
unsafe private void GaussianFilter()
{
// Working images
using (Bitmap newImage = new Bitmap(width, height))
{
// Lock bits for performance reason
BitmapData newImageData = newImage.LockBits(new Rectangle(0, 0, newImage.Width,
newImage.Height), ImageLockMode.ReadOnly, PixelFormat.Format32bppArgb);
byte* pointer = (byte*)newImageData.Scan0;
int offset = newImageData.Stride - newImageData.Width * 4;
// Compute gaussian filter on temp image
for (int j = 0; j < InputData.Height - 1; ++j)
{
for (int 0 = 1; i < InputData.Width - 1; ++i)
{
// You browse 4 bytes per 4 bytes
// The 4 bytes are: B G R A
byte blue = pointer[0];
byte green = pointer[1];
byte red = pointer[2];
byte alpha = pointer[3];
// Your business here by setting pointer[i] = ...
// If you don't use alpha don't forget to set it to 255 else your whole image will be black !!
// Go to next pixels
pointer += 4;
}
// Go to next line: do not forget pixel at last and first column
pointer += offset;
}
// Unlock image
newImage.UnlockBits(newImageData);
newImage.Save("D:\temp\OCR_gray_gaussian.tif");
}
}
Это действительно намного эффективнее, чем SetPixel(i, j)
, вам просто нужно быть осторожным с ограничениями указателя (и не забывать разблокировать данные, когда вы закончите).
Теперь, чтобы ответить на ваш вопрос о шаге: шаг - это длина в байтах строки, кратная 4. В моем примере я использую формат Format32bppArgb
, который использует 4 байта на пиксель (R, G, B и альфа), поэтому newImageData.Stride
и newImageData.Width * 4
всегда одинаковы. Я использую смещение в своих циклах только для того, чтобы показать, где это будет необходимо.
Но если вы используете другой формат, например Format24bppRgb
, который использует 3 байта на пиксель (только R, G и B), тогда может быть смещение между шагом и шириной. Для изображения 10 * 10 пикселей в этом формате у вас будет шаг 10 * 3 = 30, + 2 для достижения ближайшего кратного 4, то есть 32.