С# альтернатива setpixel

Я прочитал несколько статей, которые являются альтернативами использованию setpixel/getpixel, но я не понимаю, как они относятся к моей проблеме.

У меня есть многоцветное изображение, которое (в зависимости от динамических значений, взятых из БД) меняет цвет каждой цветовой группы пикселей на новый цвет.

Допустим, я хочу, чтобы все пиксели со значением Argb -989556 были изменены на -16, а все пиксели со значением Argb -1331 изменены на -5383962. В настоящее время я просматриваю каждый пиксель в растровом изображении и проверяю их значение, если они совпадают, то они изменяются с помощью setpixel.

Я уверен, что должен быть лучший способ, но я слишком туп, чтобы увидеть его!


person T1gg3rB0unC3    schedule 25.06.2012    source источник
comment
В чем проблема с использованием GetPixel()/SetPixel()? Пожалуйста, сообщите нам, с какой библиотекой пользовательского интерфейса вы работаете, WinForms, WPF, SilverLight...   -  person Slugart    schedule 25.06.2012
comment
Set/getpixel слишком медленный для Интернета (изображения создаются динамически). Просто используя его через веб-приложение .net, доставляя изображение через общий обработчик.   -  person T1gg3rB0unC3    schedule 25.06.2012
comment
Я проверю матрицу преобразования цвета - спасибо за предложение.   -  person T1gg3rB0unC3    schedule 25.06.2012
comment
@ T1gg3rB0unC3: SetPixel везде работает медленно. Вы можете получить указатель на данные изображения, вызвав Bitmap.LockBits, что довольно быстро. если матрица работает для вас, продолжайте с этим.   -  person Ed S.    schedule 25.06.2012
comment
@Slugart: я (предварительно) добавил тег gdi+, так как кажется, что все говорят об этом (если все говорят об одном и том же API). Не говоря уже об этом, вопрос может быть несколько бесполезным для будущих посетителей.   -  person O. R. Mapper    schedule 25.06.2012
comment
@ T1gg3rB0unC3, В будущих вопросах не добавляйте благодарственные письма, вместо этого проголосуйте за хорошие ответы и примите один. Также всякий раз, когда вы говорите о лучшем способе, постарайтесь указать, каким образом что-то должно быть лучше. т.е. в этом вопросе вы, вероятно, хотите быстрее...   -  person Alexei Levenkov    schedule 25.06.2012


Ответы (3)


Взгляните на ImageAttributes.SetRemapTable

Другой пример.

person hometoast    schedule 25.06.2012
comment
Отлично - это сработало - Большое спасибо за ваше предложение! :) - person T1gg3rB0unC3; 29.06.2012

Если вы меняете целые цвета, вы, вероятно, не хотите менять их для каждого пикселя. Существует матрица преобразования цвета, которая должна позволить вам изменить все пиксели цвета в изображении с помощью нескольких строк кода, без необходимости перебирать и манипулировать каждым пикселем изображения, что ужасно медленно.

См. эти ссылки:

http://msdn.microsoft.com/en-us/library/6tf7sa87(v=vs.71).aspx

http://msdn.microsoft.com/en-us/library/system.drawing.imaging.colormatrix.aspx

person Neil N    schedule 25.06.2012
comment
Преобразование — отличная идея, если OP в порядке со значениями, которые переполняются и не ограничиваются. Я помню, как пробовал это лет (4 или больше) назад, и это было проблемой для меня, поэтому в итоге я просто позвонил LockBits и выполнил работу прямо в памяти. - person Ed S.; 25.06.2012
comment
На самом деле я никогда не использовал класс цветовой матрицы, но с большим успехом использовал различные формы битов блокировки или закрепленных массивов. - person Neil N; 25.06.2012

Используйте растровые изображения, функциональность BitBlt. Я показываю пример в здесь.

person Shahadat Hossain    schedule 03.11.2013