Конференция "Media" » Как выводить полупрозрачные битмапы? [D7, WinXP]
 
  • Игорь Шевченко © (02.06.09 13:35) [20]

    > а что мне действительно не понравилось, почему в GDI все
    > 24х битное


    в gdi все зависит от характеристик растра, на котором он рисует. Через 32-х битный битмап, по крайней мере, альфа очень даже учитывается
  • antonn © (02.06.09 14:48) [21]
    я создаю tbitmap с pf32bit, рисую на нем цветом:
    function Get_color_transparent(col:tcolor; trans:byte):integer;
    begin
    result:=col or (trans shl 24);
    end;

    var col:integer;
    begin
    col:=Get_color_transparent(clred,128);


    получаю обнуленную альфу :(
  • Sapersky (02.06.09 20:30) [22]
    На некоторых системах она вообще не работала (на win2k, она не от GDI+ зависит?)

    У меня как раз на win2k работает. Хотя я только на одной машине тестировал.
    От GDI+ AlphaBlend не должна зависеть, она в msimg32.dll находится, которая есть даже в win98. Но в 98 она работает только при выводе на экран, в битмап - сразу AV; впрочем, официально 98 вообще не поддерживается ( http://msdn.microsoft.com/en-us/library/dd183351(VS.85,printer).aspx ).

    Вообще непонятно, что там может глючить. Пытается аппаратно ускорять и не получается из-за кривых драйверов? Но ты же использовал, наверное, вариант битмап->битмап с pf32bit, а там никакого ускорения не может быть в принципе.
    Попытался поискать (хотя и не очень старательно) - нашёл только это:
    http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=100477
    Там с выводом на экран, довольно специфичный случай.

    А еще она позволит вывести с полупрозрачностью картинку с альфой? :)

    Одновременно с попиксельной и общей альфой - да, хотя и несколько медленнее (что в общем понятно). "The SourceConstantAlpha value is combined with any per-pixel alpha values" (MSDN).

    да еще с перерасчетом альфы конечного изображения (вот это меня заставило окончательно от нее отказаться).

    Судя по формулам отсюда:
    http://msdn.microsoft.com/en-us/library/dd183393(VS.85,printer).aspx
    Dst.alpha она должна считать - возможно, не так, как тебе нужно, но не затирать 0-м во всяком случае.

    Вообще я не спорю с тем, что самописные функции удобнее, гибче, в некоторых случаях - быстрее, и т.д. Просто подумал, что автору вопроса для начала подошла бы и стандартная.
  • Sapersky (02.06.09 20:49) [23]
    Тест (пример использования) AlphaBlend, если кому надо:
    http://sapersky.narod.ru/files/AlphaBlend_VCL_test.rar
  • AutoBOT (02.06.09 23:54) [24]
    Спасибо всем...) ^_^



    А как насчёт "Windows Vista / 7" и их знаменитого "Aero" ?

    Я слышал, мол, в XP весь интерфейс построен на AlphaBlend, а в "Windows Vista / 7" MicroSoft просто доработало старую функцию AlphaBlend добавив новых функций, оптимизировав и ускорив её...

    Это так? А можно ли пользоваться этой обновлённой AlphaBlend в XP ?



    Более удобные и производительные способы - это, конечно, превосходно и я буду разбираться со способом antonn'а...
    Но ведь и "классику" надо знать... ;)
  • Sapersky (03.06.09 12:28) [25]
    Я слышал, мол, в XP весь интерфейс построен на AlphaBlend, а в "Windows Vista / 7" MicroSoft просто доработало старую функцию AlphaBlend добавив новых функций, оптимизировав и ускорив её..

    А я слышал, что рендер Висты построен на аппаратном ускорении. Ну и просто по логике - иначе зачем Aero требует видеокарту с шейдерами? (хотя логика у MS зачастую странная...)
    Если бы были какие-то обновления в AlphaBlend - в MSDN было бы об этом написано, а там (см. ссылки из [22]) ничего нет.
    MS, кажется, сейчас больше склонен придумывать новые API, чем развивать старые - для Висты вот придумали Direct2D. Как бы из объективных соображений, но и не без субъективного желания перетащить на новую ОС. Точнее даже не для Висты, а для 7-ки, поддержку Висты ещё только обещают.
    В общем, у MS либо малофункциональная "классика", либо сверхсовременный в первую очередь по системным требованиям "модерн". Ну ещё GDI+ есть как некий промежуточный вариант, но его часто ругают за тормознутость.
    И чем пытаться выбрать из ассортимента MS меньшее из зол - возможно, лучше изучать основы, либо обработку изображений на софтвере, по примерам Антона или на какой-нибудь другой open-source граф. библиотеке, либо аппаратную графику на базовом API - OGL, D3D.
  • Pavia © (03.06.09 23:35) [26]

    > А я слышал, что рендер Висты построен на аппаратном ускорении.

    Я это и про 98 слышил.


    > (вот тот яркорозовый фон который применяют обычно для transparent
    > color с нанесенным изображением).

    Я такое и в DX7 наблюдал. На всех картачках норм на одной розовый фон.

    Выход один делать все что в наших силах.
  • Sapersky (04.06.09 10:22) [27]
    Судя по информации отсюда:
    http://en.wikipedia.org/wiki/Desktop_Window_Manager
    GDI (рисование клиентской области окон) не ускоряется, более того, отрезали даже те зачатки ускорения, которые у него были (впрочем, настолько кривые, что мне их не жалко). Ускоряется рисование заблюренных рамочек, тумбнэйлов окон, смешивание полупрозрачных окон, сворачивание-разворачивание в 3D и т.п. Хотя почти всё из этого набора, ИМХО, можно сделать и на софтвере, разве что достаточно быстрое 3D-разворачивание получить тяжко.
    В общем, с классическими GDI-приложениями получается "полуаппаратная" графика. Полностью аппаратная - только при выводе UI новыми средствами вроде WPF (вероятно, там переписали рисование контролов на D3D). Впрочем, в случае WPF тормоза .NET, наверное, успешно компенсируют всякое ускорение.
    В других источниках пишут примерно то же самое:
    http://blogs.msdn.com/greg_schechter/archive/2006/03/05/544314.aspx
    http://blogs.msdn.com/greg_schechter/archive/2006/03/10/549310.aspx
  • AutoBOT (05.06.09 01:42) [28]
    Что ж делать? :(
  • Sapersky (05.06.09 14:14) [29]
    А что нужно-то? Спецэффекты в стиле Vista Aero? Так я уже писал: "почти всё из этого набора, ИМХО, можно сделать и на софтвере" ну и далее см. "лучше изучать основы, либо обработку изображений на софтвере, по примерам Антона или на какой-нибудь другой open-source граф. библиотеке".
    Какие-нибудь другие - это, например, FastLIB, Graphics32, SpriteUtils-2, DelphiX/TDIB и т.д.
    По поводу FastLIB vs TBitmap я уже высказывался здесь ([99]):
    http://pda.delphimaster.net/?id=1186325580&n=9&p=5
    По теории обработки изображений есть неплохой сайт (на английском):
    http://homepages.inf.ed.ac.uk/rbf/HIPR2/index.htm
  • AutoBOT (05.06.09 22:53) [30]
    Вот как раз с английским и плоховато...
    Особенно с техническим...((

    Мануалы-то смотрел, но по английски не понятно ничего...(

    "рендер Висты построен на аппаратном ускорении" - а как это на деле? Самому можно тоже как-то так делать?



    Кстати, а кто из "кто-нибудь других" Вам больше нравится и почему (из-за каких достоинтств) ? :)
  • Sapersky (06.06.09 10:39) [31]
    "рендер Висты построен на аппаратном ускорении" - а как это на деле? Самому можно тоже как-то так делать?

    Если коротко - каждое окно рисует себя не прямо на экран, а во внутренний буфер (битмап), затем эти битмапы отдаются Desktop Window Manager, который перегоняет их в D3D-текстуры и рисует окна как полигоны с наложением этих текстур, с любыми доступными через 3D эффектами.
    Как рисовать полигоны - см. Краснова:
    http://d3dengine.narod.ru/books.html
    Или исходники 2D-игрушек c igdc.ru.
    Единственный относительно сложный эффект, для которого требуются шейдеры - пресловутые заблюренные рамочки (если, конечно, список спецэффектов Aero исчерпывается тем, что я перечислил в [27] - я с Вистой "вживую" работал всего минут 15, чего-то мог и не заметить).
    По шейдерам при желании тоже можно найти материалы:
    http://forum.vingrad.ru/forum/topic-73464.html
    Ну и примеры к DX9 SDK с clootie.ru.

    Кстати, а кто из "кто-нибудь других" Вам больше нравится и почему (из-за каких достоинтств) ? :)

    Ещё раз для тех кто в танке:
    http://pda.delphimaster.net/?id=1186325580&n=9&p=5
    99-й пост, в самом конце страницы.
    К достоинствам могу добавить компактность, нет привязки к сторонним модулям (даже из стандартных используется только windows.pas).
    Есть у FastLIB и свои недостатки - кривость с т.з. ООП, неустойчивость к ошибкам, отсутствие документации и некоторых важных функций (того же попиксельного альфа-блендинга в стандартном комплекте нет, хотя для себя я давно написал/утащил из SpriteUtils).
    Graphics32 примечательна главным образом тем, что есть готовые компоненты для отображения картинки (аналог TImage), встроенная работа со слоями, элементы векторной графики.
    SpriteUtils шустра, но неудобна в использовании, заточена главным образом под KOL, исходники плохо читаются из-за чрезмерного пристрастия автора к ассемблеру. Хотя можно использовать как практическое пособие по asm.
  • Sapersky (08.06.09 18:56) [32]
    Набросал пример полупрозрачности с блюром (те самые рамочки окон) на TBitmap.
    http://sapersky.narod.ru/files/Vista_style_effects.rar
    Блюр относительно медленный, т.к. используется простой и тупой алгоритм. Можно быстрее, здесь я писал по поводу оптимизации Mean-фильтра:
    http://pda.delphimaster.net/?id=1241286940&n=7
  • имя (06.07.09 04:55) [33]
    Удалено модератором
  • имя (28.07.09 20:28) [34]
    Удалено модератором
  • Eraser © (30.07.09 03:48) [35]
    > [17] Sapersky   (02.06.09 11:46)


    > Хм, а чем так страшна AlphaBlend?

    вот тоже не понятно, по-моему отлично работает. в крайнем случае можно результирующий битмап 24 битным сделать.
  • antonn © (30.07.09 22:39) [36]

    > Eraser ©   (30.07.09 03:48) [35]
    >
    > > [17] Sapersky   (02.06.09 11:46)
    >
    >
    > > Хм, а чем так страшна AlphaBlend?
    >
    > вот тоже не понятно,

    [18] :)
  • CSS (02.08.09 05:20) [37]
    Sapersky, но это же внутри TImage... А как рисовать так саму форму? =))
  • Sapersky (03.08.09 14:40) [38]
    В моих примерах TImage используется только для хранения картинки. С тем же успехом можно грузить и из файлов, просто мне лень было вспоминать, как загрузить jpeg используя стандартный модуль.
    А рисуется всё либо на форму (в первом примере есть переключатель to bitmap/to screen), либо в буферный битмап по размеру формы (точнее, PaintBox'а, который задаёт область рисования) и потом этот битмап выводится на PaintBox.
    И кстати, у меня с использованием буфера рисуется быстрее, особенно заметно при использовании общей прозрачности, разница более чем в 10 раз.
  • UnodoFot (04.08.09 14:56) [39]
    Соглашусь с автором. Многое из вышеперечисленного действительно актуально
 
Конференция "Media" » Как выводить полупрозрачные битмапы? [D7, WinXP]
Есть новые Нет новых   [134430   +3][b:0][p:0.002]