ПредишенСледващото

Windows 98 и библиотека msimg32.dll

Преди да започнете, уверете се, че ние разбираме помежду си:
  • Bitmap, растер (растерни) - правоъгълен картина съставено от пиксели.
  • Pixel - минималния елемент на мястото на изображението на екрана или в паметта на растер.
  • Прозрачност - собственост на някои пиксели не се извеждат на изходното устройство, оставяйки на оригиналното изображение непокътнати.
  • Полупрозрачност - такива пиксела взаимодействие, при което пикселите са изведени като видима растер и изображение фон.
  • Sprite - растерни с прозрачни и полупрозрачни области.

Защо растерни изображения с прозрачност или полупрозрачност на отделни участъци? Това са важни елементи на графичния потребителски интерфейс на Windows, което може да се види всеки път, когато включите компютъра. Desktop икони са прозрачни секции, така че можете да видите "до" тях. Когато работите в Windows 98 папка, плъзнете всеки обект, иконата става прозрачна, което ви позволява да видите какво е в процес на него. И накрая, ние не трябва да забравяме за такива "grafikoemkih" програми като игри. Трудно е да си представим, че във внимателно проектирана плосък пространство "стрелец" Всички кораби имат правоъгълна форма. И когато се представя експлозии, е желателно да ги направи полу-прозрачна, по-близо до реалността на изображението.

Като цяло - нещо по този въпрос, пише доста. За да се разбере основните механизми на получаване на ефекти за прозрачност Препоръчваме Ви да прочетете статията Рон Джери "Bitmaps с прозрачност" (тя може да бъде намерена на MSDN, вижте Техническа Статии-> Multimedia-> GDI). Също така препоръчваме да проучи има статии от Дейл Rogerson ( "Sprites Направете света да се върти") и Херман Rodenta ( "Анимация в Win32").

Windows 95 и списъци на изображения

С пускането на Windows 95 на разположение на програмистите е удобно библиотечни Общи контроли. В него са включени не само новите (сега известни на всички) контроли, но и не-визуални компоненти - списък на изображението (контрол на изображението списък) на. Нейната основна цел - да проведе серия от снимки на един и същ размер. Това е удобно за използване в различни елементи - например инструмента (лентата с инструменти) панели:

Ние сме много по-заинтересовани от друга интересна функция - изображенията, съхранени в списъка на прозрачност информация. Това се постига по два начина:

  • Зареждане на растерна графика показва пикселите на цвят считат за прозрачни;
  • Получаване на специален прозрачен маска - черен и бял растер, при черните пиксели означават прозрачността съответните точки основния растер. В този случай, на прозрачността на маската трябва да има същите размери като основният модел.

Трябва да се разбере, че и в двата случая списъка с изображения ще съдържа маската на прозрачност, точно когато първия метод, той ще бъде създаден за вас. Какъв начин да се избере - вкусът на всеки програмист. Аз обикновено се намери в палитрата на някои ненужни цвят и я възлага прозрачна. В повечето случаи, не носи ярки лилави цветя (, RGB = (255,0,255)), но този път аз избрах бяло да демонстрира ефекта на прозрачността:


Създаване на прозрачни изображения списъци

Създайте списък с изображения и качване на растерна графика с прозрачността е възможно, така че:

В примерите, че ще се приеме, че битмапите са програми, ресурси и имат дълбочина на цвета 24 бита (16 млн. Цвята). Когато създавате списък, трябва да определите размера на заредената растера (влачене), цвета му формат (ILC_COLOR24, 16 милиона цвята) и знак за присъствието на маската (ILC_MASK). Последните две параметри Създаване () определя броя на изображения, записани в списъка, както и списъка нарастване стойността си при недостатъчно пространство. Макро инструкции подходящи за RGB цветове в обхвата 24-битов, в този случай - цвета на прозрачност.

По принцип, можете да качите снимка и предизвикателство, но този метод не поддържа пълноцветни изображения (както е в нашия пример):

По подразбиране този екран е ограничена до 16 цвята.

Рисуване с Списък на изображението

Какво е в списъка на изображения е много полезна, защото тя е да се улесни работата на рисуване. Ще си спомниш, от паметта на броя и реда на параметрите в BitBlt ()? Но неговото положение поради необходимостта да се подготви контекст допълнително устройство в паметта? Всичко това може да обърка не само за начинаещи, но и по-опитни програмисти.

Ситуацията се усложнява още повече, когато ние се справят с прозрачността. Трябва да се покаже на снимка няколко пъти с различни параметри операции растерни (операция Raster, ROP). Всеки път, когато ние ще се покаже малък образ на космически кораб, което трябва да направите много работа.

За щастие, Microsoft програмисти вече сте го направили за нас. Можете да чертаете растерни изображения, съдържащи се в списъка, само с едно обаждане ImageList_Draw (). Използване на MFC, настоящата покана изглежда така:

Тук PDC - указател към контекста на устройството (CDC), 0 - брой на изход от списъка с изображения, m_drawPoint - началото на позицията на изходното поле. ILD_TRANSPARENT флаг показва, че продукцията трябва да се прилага като се вземат предвид маската на прозрачност.

За любознателните ще ви уведомим, че се постига изпълнението на ефекта на прозрачност с метода, който призовава Geri Рон Черно Източник метод, т.е. "Метод на черната сила." Тя ви позволява да показва изображение с прозрачни зони за двама BitBlt () се обадите, вместо три, но изисква предварителна заменя пиксела са полупрозрачни, черно. Ето защо, товарене на растерни изображения в списъка, можете да го променят.

А сега се е създадена в резултат на поканата:

Windows 98 и библиотека msimg32.dll

Windows 98 донесе нов лесен начин за изход ясни изображения. Неговите държави-msimg32.dll библиотека съдържа нови функции за примамливи графични ефекти. За да го използвате, трябва да се свържете с проекта при изграждане msimg32.lib файл.

Сега растерни прозрачност може да бъде показан едновременно с помощта TransparentBlt функция, като се посочва прозрачен цвят в последния параметър на функцията:

"Уау - всички наведнъж!" а вие казвате. ще бъде прав. Отново е необходимо в контекста на съвместимо устройство, в което да се избере изход растер. Отново - дълго (и интуитивен) списък параметър. Но има и възможности за контрол на изхода. В този пример, X, Y, Х1, y1 - координати на изходния точка на приемника и източника, съответно. Параметри dstX и dstY - размера на изхода зона и srcX и srcY - ширината и височината на правоъгълника на дисплея на растер. Какво става, ако те питам за различни стойности? Резултатът е показан тук:

Както можете да видите, тази функция съдържа възможност за компресиране / напрежение растерни изображения. Само не прекалявайте и не се мине, тъй като размерът на отрицателните стойности - отразявайки TransparentBlt () не знам как да се създаде.

Добави, че функция TransparentBlt () в деривация се основава на възможностите на DirectX на устройството, което може да осигури подобрения в производителността в сравнение с традиционните методи.

съвет
Не забравяйте след използване контекста на устройството го изберете отново първоначалния екран (темп в нашия пример). В противен случай, има изтичане на графични ресурси на системата.

AlphaBlend (): "Полу" - не е задължително 1/2

Всички по-горе методи, работи само с един модел на прозрачност, посочени в компютърна графика, Chroma ключ. Това означава, че прозрачността е назначена с определен цвят. Други, по-усъвършенстван модел, наречен Алфа смесване. С използването на прозрачност (Alpha) се използва, за да опише характеристики на пикселите, различни от цветен компонент (R, G, B). Степента на прозрачност определя от реципрочната стойност на този параметър.

Назначаването на нейните параметри, като цяло, е видно от прототипа. От особен интерес е последната опция - BLENDFUNCTION. Това е структура (общо четири байта), който определя режима на изход.

Какво е това? Фактът, че AlphaBlend () може да работи в два различни режима.

Обикновен режим (пълна прозрачност)

първата (и най-лесният за използване) Режимът на AlphaBlend () приема, че стойността Alpha е настроен за цялата картина. В този случай, това се отнася за всички без изключение пиксела:

Този резултат е получен от такава BLENDFUNCTION формат:

За BlendOp полета в момента е определено само един допустим стойност - AC_SRC_OVER.
поле BlendFlags трябва да съдържа 0.
Лошо документирано AlphaFormat параметър определя взаимодействието на пиксела на източника и местоназначението, което ще говорим по-нататък.
параметър SourceConstantAlpha определя степента на непрозрачност. Чрез определянето тази област до 0, вие няма да видите на екрана на всички. Максималната стойност се вписва в тип BYTE е 255. Този изход растерни напълно замени зоната на дестинация. Но защо ли, в този случай, AlphaBlend ()? И тази стойност се използва, в голямата си част, за втория режим.

с режим алфа

Тя изисква допълнителна подготовка. Този режим растер, подготвени за дисплей, трябва да включва информация за степента на прозрачност на всеки пиксел. Това се постига, например, като се използва форматът на 32 бита на пиксел (един байт на цвят компонент и един - на алфа канал).

Трудности възникват тук с нищо. Аз не съм наясно с всеки графичен пакет, който ви позволява да съхранявате растерни изображения с алфа канал във формат, подходящ за AlphaBlend (). Когато се създаде програма, растерни, можем да го на диск (в Windows Bitmap формат 32-битова) спаси. Той прочете от популярни програми като ACDSee, но LoadBitmap () функция, а LoadImage () да откаже да се зареди. Когато се опитате да го сложите в ресурс rc.exe аз съм паднал с съобщение за вътрешна грешка.

Но не трябва да се обезсърчавате. Ние можем да ви приготвя растерна графика в паметта, съчетаващ, например, две растерни - с образа на даден обект и неговата сянка. За щастие, функция AlphaBlend () не може да работи с растерни изображения, създадени с помощта CreateDIBSection ():

Тук HDC - контекст, който е съвместим с изходното устройство, pbmi - указател към структура BITMAPINFO с информация за размер и цвят дълбочината на растера произвежда. параметър IUsage определя какво ще се съдържат в буфера растерни - индекси в цветовата палитра (DIB_PAL_COLORS) или насочват своите стойности (DIB_RGB_COLORS). Очевидно е, че втората - за палитрата на режим TrueColor не е необходимо.
Указател към буфера, създадена от един успешен разговор ще бъдат върнати в параметър ppvBits.
Параметрите и hSection dwOffset при работа с растерни памет трябва да посочат 0.

забележка
Всичко това не означава, че спрайтове с алфа канал, който не могат да се съхраняват в средствата по програмата. Можете да ги включи като персонализиран ресурс, изтеглени с помощта LoadResource () и да запълни буфера създаден от CreateDIBSection () констатации. Но не забравяйте, че това значително ще увеличи размера на вашия изпълним. В допълнение, можете да помислите podgruzki предварително изчислена в подобна програма, растерни изображения от външни файлове - означава изпълнение на библиотеката или с помощта на параметрите и hSection dwOffset, когато се обаждате CreateDIBSection ().

Използването CreateDIBSection () улеснява достъпа до бита на изображението: в противен случай тези снимки могат да бъдат получени само в режим на цял екран True Color 32 бита. За лечение на такъв формат на данните е идеален RGBQUAD структура:

Alpha канал може да се съхранява в rgbReserved, въпреки че е за тази цел и не е предназначен :) Освен това, има и друга (без документи) и възможност - използване функция AlphaDIBBlend (), което ние няма да се разгледа.

Резултатът е показан тук:

Подробности за работата с бита ние пропуснете растерни (всичко това може да се намери в приложения проект). Бих искала да отбележа само, че този изход се използва BLENDFUNCTION формат:

съвет
При използване на алфа канал, който все още остава възможност без превръщането на растерни бита, за да промените прозрачността на цялата картина - SourceConstantAlpha работи в този случай.

И накрая не забравяйте, че AlphaBlend () също изисква включването на проекта в библиотеката на вноса монтаж msimg32.lib, която не е налична в Windows 95.

Свързани статии

Подкрепете проекта - споделете линка, благодаря!