Вы можете манипулировать изображением в памяти, не полагаясь на системные вызовы. Если вы покопаетесь в базовом формате файла .BMP, вы можете создать свой собственный класс независимой от устройства растровой карты, который действительно «понимает» низкоуровневый формат .BMP.
Например, изображение размером 8 бит на пиксель, по сути, представляет собой двумерный массив байтов (каждый байт равен 1 пикселю) плюс простая таблица цветов. Грубо говоря (и это очень, очень грубо):
byte[,] bColors = new byte[3,256]; // 256 RGB colors
byte[,] bImage = new byte[25,50]; // 25 x 50 pixels
Хитрость заключается в том, чтобы (как всегда) получить необработанные данные о пикселях, выполнить обработку и затем обновить необработанные данные о пикселях с вашими изменениями.
Раньше я подходил к этому, преобразовывая HBITMAP GDI в DIB 24bpp, выполняя свою классную обработку изображений на необработанных пикселях (3 байта на пиксель, это облегчает), затем преобразовывая DIB обратно в HBITMAP. Все это было с использованием только классического GDI (даже до GDI +, не говоря уже о C #).
Используя этот подход, вы могли бы разработать управляющую структуру, позволяющую нескольким авторам использовать разные разделы вашего гораздо большего изображения.
Однако ... низкоуровневые вызовы BitBlt GDI, вероятно, будут намного эффективнее, чем все, что вы можете сделать. Если бы я был тобой, я бы был уверен, что выполнение 50 или 100 бит-битов подряд будет слишком медленным (тебе, вероятно, придется делать это в c ++).
Наиболее раздражающими проблемами при работе с DIB являются:
- Преобразование DIB в фактическое «изображение», готовое для отображения, и
- Преобразование фактического «изображения» в DIB
- Сохранение DIB как что-то отличное от .BMP
Основные ссылки, когда я начал изучать «ужас», которым на самом деле являются изображения:
Как вы добираетесь до / из .NET Image ... ну ... это хороший вопрос:)