Швидке перетворення кольорового зображення в чорно біле на c #

Можливо є багато методів перетворення кольорового зображення в чорно біле, і можливо навіть більш досконалих, але на даний момент представлений нижче метод, є найшвидшим, серед відомих мені.
Перетворення (у мене на комп'ютері) зображення розміром 2,3-2,5 Mb (2560x1920) займає в середньому 0,3 секунди. На мій погляд і для моїх цілей непоганий результат.
Суть методу полягає не в роботі з самою картинкою а в роботі з блоком даних, якщо дуже просто - то заморожуємо область даних з картинкою в пам'яті - змінюємо її як нам треба, і повертаємо все на круги своя.


Перебір масиву байтів здійснюється з кроком 3 оскільки кожен піксель кодується 3-ма байтами R G B.
У циклі складові R G і B підсумовуються, обчислюється середнє значення з трьох складових, після чого замість значень R G і B поміщається це середнє значення, таким чином задається необхідний тон сірого.

Для роботи процедури необхідно підключити:
System.Drawing.Imaging;
System.Runtime.InteropServices;

Приклад як це виглядає в справі:

Швидке перетворення кольорового зображення в чорно біле на c #

Роман, в циклі
for (int counter = 0; counter відбувається вихід за межі масиву rgbValues.
Пропоную написати:
for (int counter = 0; counter Всіх благ!

Швидке перетворення кольорового зображення в чорно біле на c #

Странненькие. У мене цей шматок коду узятий прямо з робочого прикладу. 100% працює.
Там же rgbValues.Length - це кількість елементів масиву. Відлік починається з 0. За умовою (Жорстко менше). За логікою не повинен вийти за межі.
ось:

Швидке перетворення кольорового зображення в чорно біле на c #

Але взагалі, мало-ли. Днями за допомогою такого ж (схожого) алгоритму розбивав велику картинку на мозаїку в масив маленьких, та так і не зрозумів чому при певній ширині (що дорівнює 50) елемента мозаїки зображення в елементах викривлялося.

Помилки не буде, якщо rgbValues.Length кратна 3.
В іншому випадку буде виліт за межі масиву.

Швидке перетворення кольорового зображення в чорно біле на c #

Так ми ж формат пікселя задали PixelFormat.Format24bppRgb це передбачає (як я розумію) що він складається з 3-х байт. І хоч як крути їх кількість буде кратно 3-м. Або я тут щось не так розумію, і це залежить від формату вихідного зображення? Я пробував на самих різних - помилок не вилітає на кшталт.

Швидке перетворення кольорового зображення в чорно біле на c #

І ще ваш код:
ідентичний моєму
по результату.

Схожі статті