Как преобразовать изображение 32bpp в индексированный формат?

StackOverflow https://stackoverflow.com/questions/579301

Вопрос

Итак, вот подробности (кстати, я использую 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.

РЕДАКТИРОВАТЬ СНОВА:

Если бы вы предоставили более подробную информацию о том, что на самом деле делает приложение, мы могли бы помочь немного больше?Например, если вы создаете веб-приложение, ни один из моих советов не будет иметь смысла.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top