Модераторы: gambit, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> GDI/GDI+: наложение маски на изображение 
:(
    Опции темы
tab
Дата 10.12.2008, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 7.10.2006
Где: RF, Dolgopa

Репутация: нет
Всего: нет



Задачка такая: допустим есть Bitmap. С ним необходимо провести кучу действий сводящихся в основном к наложению на него различных масок. В данный момент использую массив пикселов получаемый с помощью bitmapData.Scan0 и дальше маска - как комбинация соответствующих пикселов. Может быть есть в GDI/GDI+ набор функций отвечающий за наложение масок непосредственно?
PM MAIL   Вверх
Unlocker
Дата 28.1.2009, 11:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 2.11.2007
Где: Москва - Знаменск (Капустин Яр)

Репутация: нет
Всего: 2



Сабж остается неизменным.
Кратко сформулирую задачу: есть пара Bitmap'ов, которые имеют одинаковые размеры и PixelFormat. Необходимо получить изображение, полученное наложением маски на целевой Bitmap. Если пиксель окрашен на маске в белый цвет, то соответствующий пиксель изображения переносится из целевой картинки, а если в черный, то окрашивается каким-то заранее установленным цветом.
Код

public Bitmap DrawMaskedImage()
        {
            Bitmap bmp = new Bitmap(mMainImage.Width, mMainImage.Height);
            Graphics g = Graphics.FromImage(bmp);
            g.DrawImage(mMainImage, 0, 0);
            g.Dispose();
            for(int i=0; i<mMainImage.Width; i++)
            {
                for(int j=0; j<mMainImage.Height; j++)
                {
                    if(mShadowImage.GetPixel(i, j) == Color.Black)
                        bmp.SetPixel(i, j, mBackColor);
                }
            }
            return bmp;
        }

сначала рисуем базовое изображение, потом окрашиваем пикселы, соответствующие черным на маске, установленным цветом mBackColor. Только этот код оказывается неработоспособным. Буду признателен за комментарии.
--------------------
"Если бы Шекспир был программистом, то фразу "To be or not to be" он написал бы так: 2b | ! 2b."
PM MAIL ICQ Skype GTalk Jabber   Вверх
Unlocker
Дата 30.1.2009, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 125
Регистрация: 2.11.2007
Где: Москва - Знаменск (Капустин Яр)

Репутация: нет
Всего: 2



Ларчик просто открывался. Вместо этого
Код

if(mShadowImage.GetPixel(i, j) == Color.Black)
                        bmp.SetPixel(i, j, mBackColor);

Надо было написать
Код

if(mShadowImage.GetPixel(i, j).ToArgb() == Color.Black.ToArgb())
                        bmp.SetPixel(i, j, mBackColor);

Еще улучшил попиксельную обработку в плане скорости. Класс декоратора нашел Google, а код я приложил к посту.
Код

public Bitmap DrawMaskedImage()
        {
            Bitmap bmp = new Bitmap(mMainImage.Width, mMainImage.Height);
            Graphics g = Graphics.FromImage(bmp);
            g.DrawImage(mMainImage, 0, 0);
            g.Dispose();
            using(BitmapDecorator deco1 = new BitmapDecorator(bmp))
            {
                using(BitmapDecorator deco2 = new BitmapDecorator(mShadowImage))
                {
                    for(int i=0; i<mMainImage.Width; i++)
                    {
                        for(int j=0; j<mMainImage.Height; j++)
                        {
                            if(deco2.GetPixel(i, j).ToArgb() == Color.Black.ToArgb())
                                deco1.SetPixel(i, j, mBackColor);
                        }
                    }
                }
            }
            return bmp;
        }

Смысл его использования зафиксировать Bitmap методом LockBits(), провести все попиксельные операции, уничтожить декораторы вызовом Dispose(), в котором прописан UnlockBits(). Реально ускоряет попиксельную обработку достаточно больших растров.
Проблему, на мой взгляд, можно считать решенной.

Это сообщение отредактировал(а) Unlocker - 30.1.2009, 11:38

Присоединённый файл ( Кол-во скачиваний: 19 )
Присоединённый файл  BitmapDecorator.cs 5,55 Kb
--------------------
"Если бы Шекспир был программистом, то фразу "To be or not to be" он написал бы так: 2b | ! 2b."
PM MAIL ICQ Skype GTalk Jabber   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Разработка Windows Forms | Следующая тема »


 




[ Время генерации скрипта: 0.0584 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.