Модераторы: Snowy, Alexeis, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как правильно создать маску? 
V
    Опции темы
Coder
Дата 21.7.2010, 08:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

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



Привет, винградовцы smile

Есть картинка, которую необходимо нарисовать на форме средствами WinAPI. Чтобы картинка красиво отображалась без фона для нее нужно подобрать маску прозрачности. Так вот вопрос - как правильно это сделать? Рисовать маску ручками в фотошопе - обводить дотошно контур рисунка или использовать функцию MaskBlt, правда она создает не самую лучшую маску, в результате края картинки получаются рублеными...

Картинку конвертировал в jpeg чтобы она прикрепиласть, изначально была bmp

Присоединённый файл ( Кол-во скачиваний: 33 )
Присоединённый файл  binoculars.jpg 1,35 Kb
PM MAIL   Вверх
x128
Дата 21.7.2010, 09:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 29.9.2009

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



Как вариант, можно записать в альфа-канал разницу текущего пиксела и фона. Для твоей картинки, все пикселы белого цвета станут полностью прозрачные и чем сильнее цвет отличается от белого, тем менее прозрачный пиксел. 
PM MAIL WWW   Вверх
Snowy
Дата 21.7.2010, 10:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



ещё варианты:
можно сделать png и выводить через gdi+
можно положить на окно, и это окно обрезать регионом под картинку.
А края картинки и есть рубленые, ибо сглаживание с фоном. Видимо фотошоп постарался.
рисуй маску ручками, или правь картинку без сглаживания.
PM MAIL   Вверх
Coder
Дата 21.7.2010, 10:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

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



Цитата(x128 @  21.7.2010,  17:26 Найти цитируемый пост)
Как вариант, можно записать в альфа-канал разницу текущего пиксела и фона. Для твоей картинки, все пикселы белого цвета станут полностью прозрачные и чем сильнее цвет отличается от белого, тем менее прозрачный пиксел. 


Прикрепил картинку того, что получается при использовании  MaskBlt() - исключается только белый цвет, а тень под биноклем получается, ка рубленный кусок. Попробую способ с альфа каналом, по идее тень должна сгладиться.

Цитата(Snowy @  21.7.2010,  18:03 Найти цитируемый пост)
можно сделать png и выводить через gdi+можно положить на окно, и это окно обрезать регионом под картинку.А края картинки и есть рубленые, ибо сглаживание с фоном. Видимо фотошоп постарался.рисуй маску ручками, или правь картинку без сглаживания.


Не охота gdi+ тянуть smile
так вот, как края сгладить с фоном, если фон может быть разный?

Это сообщение отредактировал(а) Coder - 21.7.2010, 10:27

Присоединённый файл ( Кол-во скачиваний: 23 )
Присоединённый файл  untitled.JPG 3,18 Kb
PM MAIL   Вверх
Snowy
Дата 21.7.2010, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



ну gdi+ тянуть никуда не нужно - он в винде уже имеется.
А картинку как раз и не нужно смешивать с фоном.
В этом как раз и проблема, что фотошоп тебе уже наперемешивал с белым фоном.
Нужно переделывать в png, отрезать полностью тень и рисовать новую - честно полупрозрачную.
Эта тень уже испорчена смешиванием с белым цветом.
Если без альфа канала, то нужно просто тень превратить в полность серую. Не програмно, а в паинте ручками.
Тут не програмная проблема - проблема в самой картинке.
PM MAIL   Вверх
Bitter
Дата 21.7.2010, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

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



Цитата(Snowy @  21.7.2010,  10:03 Найти цитируемый пост)
можно сделать png и выводить через gdi+


А зачем gdi+? PNG нормально рисуется в Delphi7 без gdi+

Подключи в uses файл PNGImage из приложенного архива, и можешь делать так:

Код


var  Png:TPNGObject;
       Image:TImage;
begin
 Image:=TImage.Create(Form1);

 Png:=TPNGObject.Create;
 Png.LoadFromFile('PNGFileName.png');

 Image.Parent:=Form1;
 Image.Width:=Png.Width;
 Image.Height:=Png.Height;
 Image.Picture.Assign(Png);
 Png.Free;
end;



Это сообщение отредактировал(а) Bitter - 21.7.2010, 12:17

Присоединённый файл ( Кол-во скачиваний: 7 )
Присоединённый файл  PNG.rar 53,20 Kb
PM MAIL ICQ Skype   Вверх
Snowy
Дата 21.7.2010, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 11363
Регистрация: 13.10.2004
Где: Питер

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



Цитата(Bitter @  21.7.2010,  12:16 Найти цитируемый пост)
А зачем gdi+?
Затем, что 
Цитата(Coder @  21.7.2010,  08:02 Найти цитируемый пост)
необходимо нарисовать на форме средствами WinAPI


PM MAIL   Вверх
Bitter
Дата 21.7.2010, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный лентяй
***


Профиль
Группа: Завсегдатай
Сообщений: 1209
Регистрация: 15.8.2004
Где: Харьков, Ukraine

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



а, блин. Ну тогда отбой тревоги smile
PM MAIL ICQ Skype   Вверх
AntonN
Дата 21.7.2010, 13:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

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



собрать битмап 32-х битный с альфой и вывести через alphablend() (картинка может изначально была в bmp 32 битном?)


--------------------
user posted image
PM MAIL WWW   Вверх
Coder
Дата 22.7.2010, 04:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 13.12.2004

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



Цитата(Snowy @  21.7.2010,  18:49 Найти цитируемый пост)
ну gdi+ тянуть никуда не нужно - он в винде уже имеется.А картинку как раз и не нужно смешивать с фоном.В этом как раз и проблема, что фотошоп тебе уже наперемешивал с белым фоном.Нужно переделывать в png, отрезать полностью тень и рисовать новую - честно полупрозрачную.Эта тень уже испорчена смешиванием с белым цветом.Если без альфа канала, то нужно просто тень превратить в полность серую. Не програмно, а в паинте ручками.Тут не програмная проблема - проблема в самой картинке.


спасибо, так и сделал все получилось! с тенью - красиво! 
мне не хотелось тянуть заголовочные файлы gdi+, но в дальнейшем придется выводить jpeg так что пусть будут smile

Цитата(x128 @  21.7.2010,  17:26 Найти цитируемый пост)
Как вариант, можно записать в альфа-канал разницу текущего пиксела и фона. Для твоей картинки, все пикселы белого цвета станут полностью прозрачные и чем сильнее цвет отличается от белого, тем менее прозрачный пиксел. 

Цитата(AntonN @  21.7.2010,  21:25 Найти цитируемый пост)
собрать битмап 32-х битный с альфой и вывести через alphablend() (картинка может изначально была в bmp 32 битном?)


а с этим способом не разобрался :(
вроде в фотошопе отображается, что есть альфа канал и картинка 32-битная. а как туда записать разницу и правильно вызвать  alphablend, увы ... получилось только вывести полупрозрачную картинку с белым фоном. ведь  БМП не может без фона!

далек я от графики  smile 


Это сообщение отредактировал(а) Coder - 22.7.2010, 04:06
PM MAIL   Вверх
AntonN
Дата 22.7.2010, 11:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

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



Тебе нужно было вывести с полупрозрачностью или с поддержкой transaprent_color (цветовой ключ, прозрачный цвет как в GIF)?
Если первое - то маску ты сам никак не сделаешь в общем случае. А именно таким способом выведен твой бинокль на белую подложку, с альфой. Отсюда нужно исходное изображение с поддержкой альфаканала (png, bmp), все костыльные способы с перегоном в png, созданием цветового ключа и рисованием тени от руки не дадут исходного результата



--------------------
user posted image
PM MAIL WWW   Вверх
x128
Дата 22.7.2010, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 29.9.2009

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



Цитата(AntonN @  22.7.2010,  11:35 Найти цитируемый пост)
все костыльные способы с перегоном в png, созданием цветового ключа и рисованием тени от руки не дадут исходного результата

Исходного не дадут, но приемлемого результата вполне можно добиться.

user posted image
Картинка преобразована из JPEG-а в в первом сообщении и нарисована с помощью AlphaBlend.

Coder, картинку прикрепил, если результат устраивает, поделюсь кодом преобразования. И прикрепи оригинальную картинку, а не JPEG.



Присоединённый файл ( Кол-во скачиваний: 6 )
Присоединённый файл  binoculars.png 1,11 Kb
PM MAIL WWW   Вверх
AntonN
Дата 22.7.2010, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

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



ну это кастыльный метод, не ко всем изображениям применим, не говоря уже о том, что нарисуется не та картинка, которая была художником создана smile
например с подобной придется повозиться, причем уже ручками:
user posted image


--------------------
user posted image
PM MAIL WWW   Вверх
x128
Дата 22.7.2010, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 88
Регистрация: 29.9.2009

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



Цитата(AntonN @  22.7.2010,  13:41 Найти цитируемый пост)
ну это кастыльный метод, не ко всем изображениям применим, не говоря уже о том, что нарисуется не та картинка, которая была художником создана 

Понятное дело, что не всегда получится приемлемый результат и точно не выйдет восстановить оригинал, но за не имением оригинала, это лучше чем ничего.
Цитата(AntonN @  22.7.2010,  13:41 Найти цитируемый пост)
например с подобной придется повозиться, причем уже ручками:

Возиться не пришлось, результат конечно не оригинал, но смотрится не плохо
user posted image



Присоединённый файл ( Кол-во скачиваний: 5 )
Присоединённый файл  test.png 8,38 Kb
PM MAIL WWW   Вверх
AntonN
Дата 22.7.2010, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 491
Регистрация: 8.8.2006

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



ну да, цвета становятся "грязноватыми"


--------------------
user posted image
PM MAIL WWW   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Звук, графика и видео"
Girder
Snowy
Alexeis

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • По вопросам разработки игр стоит заглянуть сюда

FAQ раздела лежит здесь!


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

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Звук, графика и видео | Следующая тема »


 




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


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

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