Как преобразовать изображение 32bpp в индексированный формат?
-
06-09-2019 - |
Вопрос
Итак, вот подробности (кстати, я использую C#):
Я получаю изображение с разрешением 32 бит/с (сжатое в формате JPEG) с сервера.В какой-то момент я хотел бы использовать свойство Palette растрового изображения, чтобы окрасить перенасыщенные пиксели (яркость> 240) в красный цвет.Для этого мне нужно преобразовать изображение в индексированный формат.
Я попытался преобразовать изображение в GIF, но качество потерялось.Я попытался создать новое растровое изображение в индексном формате этими методами:
// causes a "Parameter not valid" error
Bitmap indexed = new Bitmap(orig.Width, orig.Height, PixelFormat.Indexed)
// no error, but the resulting image is black due to information loss I assume
Bitmap indexed = new Bitmap(orig.Width, orig.Height, PixelFormat.Format8bppIndexed)
Я сейчас в растерянности.Данные в этом изображении постоянно изменяются пользователем, поэтому я не хочу вручную устанавливать пиксели с яркостью > 240, если можно этого избежать.Если я смогу установить палитру один раз при создании изображения, моя работа будет завершена.Если я с самого начала поступаю неправильно, пожалуйста, дайте мне знать.
РЕДАКТИРОВАТЬ:Спасибо, ребята, вот более подробно о том, чего я пытаюсь достичь.
Мы сканируем слайд ткани с высоким разрешением (приложение для изучения патологии).Я пишу интерфейс реального сканера.Мы используем камеру линейного сканирования.Чтобы проверить скорость строки камеры, пользователь сканирует очень небольшую часть и смотрит на изображение.
Изображение отображается рядом с полосой отслеживания.Когда пользователь перемещает полосу отслеживания (регулируя скорость строки), я изменяю общую интенсивность изображения, пытаясь смоделировать, как оно будет выглядеть при новой скорости строки.В настоящее время я делаю это, используя объекты ImageAttributes и ColorMatrix.
Когда пользователь настраивает полосу отслеживания, я настраиваю матрицу.Это не дает мне информации о каждом пикселе, но производительность очень хорошая.я мог используйте здесь LockBits и некоторый небезопасный код, но я бы предпочел не переписывать его, если это возможно.Когда будет создано новое изображение, я бы хотел, чтобы все пиксели со значением яркости > 240 были окрашены в красный цвет.Я думал, что определение палитры для растрового изображения было бы простым способом сделать это.
Решение 3
Спасибо всем за помощь.Кажется, это можно решить, используя класс ImageAttributes и просто установив таблицу перераспределения цветов.
ColorMap[] maps = new ColorMap[someNum]
// add mappings
imageAttrs.SetRemapTable(maps);
Еще раз спасибо за помощь, хоть что-то узнал.
Другие советы
Переход от индексации с 32 бит на 8 бит почти всегда приводит к потере качества, если только исходное изображение не содержит менее 256 цветов.
Можете ли вы создать другое изображение, которое представляет собой наложение с затронутыми красными пикселями, а затем показать оба из них?
Поскольку вы собираетесь использовать яркость > 240, вы можете сначала преобразовать наложение в оттенки серого, а затем в индексированное, чтобы получить слишком яркие пиксели.
Вы не указываете, что вы с ним делаете после того, как отметили правонарушителей, поэтому я не знаю, сработает ли это.
Похоже, это можно легко сделать с помощью пиксельного шейдера.Даже очень ранние модели шейдеров поддерживали такие простые вещи.
Однако вопрос в следующем:
Можете ли вы без особых хлопот включить поддержку шейдеров в свое приложение?
Знаете ли вы программирование шейдеров?
РЕДАКТИРОВАТЬ:
Вероятно, у вас нет 3D-контекста, в котором вы могли бы делать такие вещи =/
В основном я просто высказывал свои мысли.
Манипулирование изображением попиксельно должно быть осуществимо в режиме реального времени с помощью одного процессора, не так ли?
Если нет, изучите программирование GPGPU и Open CL.
РЕДАКТИРОВАТЬ СНОВА:
Если бы вы предоставили более подробную информацию о том, что на самом деле делает приложение, мы могли бы помочь немного больше?Например, если вы создаете веб-приложение, ни один из моих советов не будет иметь смысла.