Какой самый эффективный способ прохождения пикселей изображения

1

У меня есть 2 изображения, которые мне нужно сравнить по 1280x800 каждый, и я слишком беспокоюсь об эффективности, так как мне придется делать те же операции, которые включают в себя цикл каждую секунду

Я могу думать о множестве способов прокрутки пикселей объекта Bitmap, но я не знаю, что было бы более эффективным, поскольку теперь я использую простой цикл, но он использует слишком много памяти и обработки, которые я не мог себе позволить на данный момент

Некоторые настройки здесь и там, и все, что он делает, - это меньше памяти для большей обработки или наоборот

Любые советы, информация или опыт высоко оценены, я также открыт для использования внешних библиотек, если они имеют гораздо лучшую эффективность.

  • 2
    unsafe LockBits int* BitmapData.Scan0 UnlockBits
  • 1
    Обратите внимание, что ссылка в ответе Эндрю работает только для 24bppRGB, а не для общего ARGB. Не трудно адаптироваться, см. Например здесь ! Я не люблю использовать небезопасные, но я должен признать, что это даже немного быстрее, чем Lockbits.
Показать ещё 1 комментарий
Теги:
image-processing
performance
loops
image

1 ответ

1
Лучший ответ

от qaru.site/questions/270342/...

Bitmap bmp = new Bitmap("SomeImage");

// Lock the bitmap bits.  
Rectangle rect = new Rectangle(0, 0, bmp.Width, bmp.Height);
BitmapData bmpData = bmp.LockBits(rect, ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);

// Get the address of the first line.
IntPtr ptr = bmpData.Scan0;

// Declare an array to hold the bytes of the bitmap.
int bytes = bmpData.Stride * bmp.Height;
byte[] rgbValues = new byte[bytes];
byte[] r = new byte[bytes / 3];
byte[] g = new byte[bytes / 3];
byte[] b = new byte[bytes / 3];

// Copy the RGB values into the array.
Marshal.Copy(ptr, rgbValues, 0, bytes);

int count = 0;
int stride = bmpData.Stride;

for (int column = 0; column < bmpData.Height; column++)
{
    for (int row = 0; row < bmpData.Width; row++)
    {
        b[count] = (byte)(rgbValues[(column * stride) + (row * 3)]) 
        g[count] = (byte)(rgbValues[(column * stride) + (row * 3) + 1]);
        r[count++] = (byte)(rgbValues[(column * stride) + (row * 3) + 2]);
    }
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню