Да-а... Сколько раз я спотыкался о свое незнание самых-самых основ. Опять такой случай.
Из приведенного примера вышеуказанной статьи (тот, который
ARGB)
понял следующее:
1) Создается двухмерный
Integer массив, размером с изображение для хранения цветов (использование
Integer`а обосновывается 32-битной цветовой схемой хранения данных о пикселе) для исходного изображения и для результатов
2) В неуправляемой памяти распределяется место под этот самый массив (массивы), что бы его (их) не подвинули (
спасибо статье с головного сайта про NET указатели и маршалинг)
3) Производится битное копирование изображения сначала в простой
Integer массив, затем в распределенную неуправлямую память
4) Заполняются массивы кодом (пример - альфа):
- Код: Выделить всё
alfa = (BmpArray(Row, Col) >> 24) And &HFF
AArray(Row, Col) = alfa Or (alfa << 8) Or (alfa << 16) Or &HFF000000
4.1) Берем Integer, сдвигаем биты вправо на 24, оставляя только альфу
4.2) ОБрезаем альфу до 8 бит
4.3) заполняем каналы RGB значением
alfa (для получения
GrayScale изображения на выходе), приплюсовывая в нему непрозрачность в A-канал
5) Создаем новое 32х битное изображение, копируя в него данные из неуправляемого массива
...
6) Освобождаем память
Не понял:
1) Что означает блокировка/разблокировка Bitmap`а в памяти и зачем это нужно
2) Относительно пункта 4.2 - почему alfa объявлена как Integer, если предпологается "обрезание" до 1 байта
Максимально разжевано объясните, плиз, где я прав, а где не очень.
Кстати, придя в NET из VB6, где битовыми сдвигами в стандартном функционале и не пахло, а мне они и не нужны были, с ними почти не знаком. Также прошу пнуть в сторону фундаментальной информации по теме.
Уж очень хочется заполнить в своей голове подобного рода безграмотность.