Отказ от ответственности: я не знаю C #, но я сделал слишком много обработки изображений на C / C ++, поэтому я не могу передать ответ - я отвечу на C, так как я думаю, что C # имеет схожий синтаксис.
Палитру имеют как 1-битные (два цвета), так и 8-битные (256 цветов) изображения. но переход от 1-битного к 8-битному переходу очень прост - поскольку квантования не требуется, просто повышается частота дискретизации.
Сначала вам нужно выбрать (или импортировать) два цвета палитры 1-битного изображения. Если у вас их нет, я предлагаю использовать черный (0x000000FF) и белый (0xFFFFFFFF) для ясности (примечание: оба цвета - RGBA, я думаю, что окна используют ABGR). Это будет ваша «палитра».
Затем сопоставьте каждый цвет палитре - входное изображение будет иметь width * height / 8
байтов. Каждый байт представляет восемь пикселей. Поскольку я не знаю о вашем опыте работы с битами (то есть я не хочу сбивать вас с толку и не хочу, чтобы вы бездумно копировали и вставляли код, предоставленный вами в интернете), я оставлю этот ответ простой.
// Insert your image's attributes here
int w = image.width;
int h = image.height;
// Data of the image
u8* data = image.data;
/*
* Here, you should allocate (w * h) bytes of data.
* I'm sure C# has ByteArray or something similar...
* I'll call it output in my code.
*/
u8* output = new u8[w * h];
u8* walker = output;
// Loop across each byte (8 pixels)
for(int i=0; i<w*h/8; ++i) {
// Loop across each pixel
for(int b=(1<<7); b>0; b>>=1) {
// Expand pixel data to output
*walker++ = !!(data[i] & b);
}
}
Надеюсь, это поможет!