Для ответа на вопрос о конверсии
Я не знаком с библиотеками изображений c ++, но уверен, что этот код уже где-то существует. Но если вы хотите, вы можете сделать это самостоятельно.
Каждый пиксель имеет три канала: красный, зеленый и синий. В 16-битной битовой карте каждый канал не имеет одинакового количества бит на канал. Как правило, зеленый является первым, чтобы получить дополнительные биты, потому что человеческий глаз наиболее чувствителен к этому цвету.
Вероятно, 565 - 5 для красного, 6 для зеленого и 5 для синего.
Для 18-битной битовой карты (как указано выше) каждый канал имеет 6 бит. Так что зеленый это легко! Просто скопируйте значение из 16-битного формата в 18-битный формат. Два других канала немного сложнее. Вы должны интерполировать от 5 до 6:
18_Value = (16_Value / 32) * 64 //integers only of course. You need to round properly to get best results.
И вот оно у вас есть. Если вы еще не знакомы со следующим, я бы посоветовал вам изучить их:
- Операторы сдвига битов
- Растровое изображение
- Pointer Math
- Выравнивание байтов
- Edit--
Убедитесь, что вы знаете, как все выложено в памяти; RGB или BGR. Это будет мешать вам, если вы сделаете что-нибудь более сложное, чем это, и вы думаете об этом задом наперед (поскольку Грин находится в середине, это не , что важно для этого преобразования).