Как преобразовать 32-битное изображение в индексированный формат? - PullRequest
2 голосов
/ 23 февраля 2009

Итак, вот подробности (я использую C # BTW):

Я получаю изображение 32 бита (сжатый в формате JPEG) с сервера. В какой-то момент я хотел бы использовать свойство «Палитра» растрового изображения для окрашивания пересыщенных пикселей (яркость> 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 ]

1 голос
/ 24 февраля 2009

Переход от индексированных 32bpp к 8bpp почти всегда приведет к потере качества, если только исходное изображение не содержит менее 256 цветов.

Можете ли вы создать другое изображение с наложенными пикселями, окрашенными в красный цвет, а затем показать оба из них?

Поскольку яркость> 240, вы можете сначала преобразовать наложение в оттенки серого, а затем в индексированные, чтобы получить более яркие пиксели.

Вы не указываете, что вы делаете с ним, как только вы пометили нарушителей, поэтому я не знаю, сработает ли это.

0 голосов
/ 24 февраля 2009

Спасибо за помощь всем. Кажется, что это можно решить с помощью класса ImageAttributes и просто установив таблицу переназначения цветов.

ColorMap[] maps = new ColorMap[someNum]
//  add mappings
imageAttrs.SetRemapTable(maps);

Еще раз спасибо за помощь, по крайней мере, я кое-что узнал.

0 голосов
/ 24 февраля 2009

Звучит как то, что вы могли бы легко сделать с помощью пиксельного шейдера. Даже самые ранние модели шейдеров поддерживают что-то столь же простое.

Вопрос, однако:

Можете ли вы включить поддержку шейдеров в свое приложение без особых проблем?

Знаете ли вы программирование шейдеров?

EDIT:

У вас, вероятно, нет трехмерного контекста, где вы могли бы делать такие вещи = /

В основном я просто высказывал свои мысли.

Управление изображением пиксель за пикселем должно выполняться в режиме реального времени с одним процессором, не так ли?

Если нет, посмотрите на программирование GPGPU и Open CL.

ИЗМЕНИТЬ СНОВА:

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

...