BGRABitmap/ru: what changed
Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.
Title: BGRABitmap/ru
| Old | New | Line | |
|---|---|---|---|
| 1 | + | См.также: [[Developing with Graphics/ru|Developing with Graphics]] | |
| 2 | + | ||
| 3 | + | ### Описание | |
| 4 | + | ||
| 5 | + | **BGRABitmap** - это набор модулей, предназначенных для изменения и создания изображений с прозрачностью (альфа-канал). Прямой пиксельный доступ позволяет быстро обрабатывать изображения. Библиотека была протестирована на Windows, Ubuntu и Mac OS X (последняя версия не работает на Mac), с наборами виджетов win32, gtk1, gtk2 и carbon. | |
| 6 | + | ||
| 7 | + | Основным классом является [[TBGRABitmap class|TBGRABitmap]], который является производным от [[fcl-image|TFPCustomImage]]. Существует также [[TBGRAPtrBitmap class|TBGRAPtrBitmap]], позволяющий редактировать данные BGRA, которые уже распределены. Этот формат состоит из 4 байтов для каждого пикселя (синий, зеленый, красный и альфа в этом порядке). | |
| 8 | + | ||
| 9 | + | Изображение может быть отображено на обычном Canvas или на [[BGRABitmap and OpenGL|OpenGL surface]]. | |
| 10 | + | ||
| 11 | + | ### Дополнительные пакеты | |
| 12 | + | ||
| 13 | + | Некоторые пакеты используют BGRABitmap для обеспечения элементов управления приятной графикой: | |
| 14 | + | ||
| 15 | + | - BGLControls: предоставляет TBGLVirtualScreen для рисования на поверхности OpenGL. Этот пакет находится в архиве BGRABitmap. | |
| 16 | + | - [[BGRAControls]]: ярлыки с тенями, красивыми кнопками, фигурами и т.д. | |
| 17 | + | - [[uE Controls]]: датчики, светодиоды и т.д. | |
| 18 | + | - [[Material Design]]: Компоненты пользовательского интерфейса, основанные на принципах разработки материалов Google. | |
| 19 | + | - BGRAControlsFX[1](https://forum.lazarus.freepascal.org/index.php?topic=34534.0): элементы управления рендеринга на поверхности OpenGL. | |
| 20 | + | ||
| 21 | + | Некоторые примеры в папке с примерами используют BGRAControls и BGLControls. Вам может понадобиться установить их, чтобы открыть эти проекты в Lazarus. См. [[Install Packages]]. | |
| 22 | + | ||
| 23 | + | ### Использование BGRABitmap | |
| 24 | + | ||
| 25 | + | #### Руководства | |
| 26 | + | ||
| 27 | + | - [Как конвертировать приложение из TCanvas в BGRABitmap(англ.)](http://www.youtube.com/watch?v=HGYSLgtYx-U) | |
| 28 | + | - [[BGRABitmap tutorial TAChart|Using BGRABitmap to render a TAChart]] | |
| 29 | + | - [[BGRABitmap tutorial|A series of tutorials to learn step by step]] | |
| 30 | + | - Примеры на [GitHub](https://github.com/bgrabitmap). | |
| 31 | + | - [Цикл уроков по компоненту BGRABitmap](http://dropdoc.ru/Zyr2) от пользователя [sign](http://www.freepascal.ru/forum/memberlist.php?mode=viewprofile&u=9593) | |
| 32 | + | ||
| 33 | + | #### Обзор | |
| 34 | + | ||
| 35 | + | Функции имеют длинные имена, чтобы быть понятными. Почти все доступно в виде функции или с помощью свойства объекта [[TBGRABitmap class|TBGRABitmap]]. Например, вы можете использовать CanvasBGRA, чтобы иметь некоторые холсты, похожие на TCanvas (с прозрачностью и сглаживанием) и Canvas2D, чтобы иметь те же функции, что и [HTML canvas](https://developer.mozilla.org/en/HTML:Canvas). | |
| 36 | + | ||
| 37 | + | Некоторые специальные функции требуют использования модулей, но они могут вам не понадобиться: | |
| 38 | + | ||
| 39 | + | - TBGRAMultishapeFiller иметь сглаженные соединения многоугольников в BGRAPolygon | |
| 40 | + | - TBGRATextEffect в BGRATextFX | |
| 41 | + | - 2D преобразования находятся в BGRATransform | |
| 42 | + | - TBGRAScene3D в BGRAScene3D | |
| 43 | + | - Если вам нужны слои, BGRALayers предоставляет TBGRALayeredBitmap | |
| 44 | + | ||
| 45 | + | Двойная буферизация на самом деле не является частью BGRABitmap, потому что она больше о том, как обрабатывать формы. Для двойной буферизации вы можете использовать TBGRAVirtualScreen, который находится в пакете [[BGRAControls]]. Кроме того, двойная буферизация в BGRABitmap работает как любая двойная буферизация. Вам нужно иметь растровое изображение, в котором вы храните свой чертеж и которое вы отображаете с помощью одной инструкции Draw. | |
| 46 | + | ||
| 47 | + | #### Ссылка на модуль BGRABitmapTypes | |
| 48 | + | ||
| 49 | + | - [[BGRABitmap Pixel types/ru|Pixel types and functions]]: *TBGRAPixel*, *THSLAPixel*... | |
| 50 | + | - [[BGRABitmap Types imported from Graphics|Types imported from Graphics]]: *TColor*, стиль пера... | |
| 51 | + | - [[BGRABitmap Color definitions|Color definitions]]: *VGAColors*, *CSSColors*... | |
| 52 | + | - [[BGRABitmap Geometry types|Geometry types]]: *TPointF*, кривые Берзье, *TArcDef*... | |
| 53 | + | - [[BGRABitmap Miscellaneous types|Miscellaneous types]]: шрифт, формат изображения, ресэмплинг... | |
| 54 | + | - [[TBGRACustomBitmap and IBGRAScanner]]: базовый класс для TBGRABitmap и сканеров | |
| 55 | + | ||
| 56 | + | #### Установка | |
| 57 | + | ||
| 58 | + | После распаковки архива BGRA часто не компилируется в Linux. Попробуйте использовать макрос IDE | |
| 59 | + | ||
| 60 | + | ` LCLWidgetType:=gtk2` | |
| 61 | + | ||
| 62 | + | в таких случаях. Тем не менее, некоторые другие части могут не скомпилироваться. | |
| 63 | + | ||
| 64 | + | #### Простой пример | |
| 65 | + | ||
| 66 | + | Создайте проект и откройте bgrabitmappackage.lpk с помощью Lazarus. В окне пакета нажмите "Use \> Add to Project". Затем в исходном коде основного файла (основная форма или основная программа) добавьте в раздел uses модуль BGRABitmap. Вам также может понадобиться добавить модуль BGRAGraphics, если вы используете определенные типы, которые унаследованы от LCL. | |
| 67 | + | ||
| 68 | + | ``` pascal | |
| 69 | + | Uses | |
| 70 | + | Classes, SysUtils, BGRABitmap, BGRABitmapTypes; | |
| 71 | + | ``` | |
| 72 | + | ||
| 73 | + | Модуль BGRABitmapTypes содержит общие определения, но можно объявить только BGRABitmap для загрузки и отображения растрового изображения. Затем первым шагом является создание объекта [[TBGRABitmap class|TBGRABitmap]]: | |
| 74 | + | ||
| 75 | + | ``` pascal | |
| 76 | + | var | |
| 77 | + | bmp: TBGRABitmap; | |
| 78 | + | begin | |
| 79 | + | bmp := TBGRABitmap.Create(100, 100, BGRABlack); // создаем изображение размером 100x100 пикселей с черным фоном | |
| 80 | + | ||
| 81 | + | bmp.FillRect(20, 20, 60, 60, BGRAWhite, dmSet); // рисуем белый квадрат без прозрачности | |
| 82 | + | bmp.FillRect(40, 40, 80, 80, BGRA(0, 0, 255, 128), dmDrawWithTransparency); // рисуем прозрачный синий квадрат | |
| 83 | + | ... | |
| 84 | + | end; | |
| 85 | + | ``` | |
| 86 | + | ||
| 87 | + | Наконец, чтобы показать растровое изображение: | |
| 88 | + | ||
| 89 | + | ``` pascal | |
| 90 | + | procedure TFMain.FormPaint(Sender: TObject); | |
| 91 | + | begin | |
| 92 | + | bmp.Draw(Canvas, 0, 0, True); // рисуем растровое изображение в непрозрачном режиме (быстрее) | |
| 93 | + | end; | |
| 94 | + | ``` | |
| 95 | + | ||
| 96 | + | Смотрите полный исходный код в [[BGRABitmap tutorial 1|tutorial 1]]. | |
| 97 | + | ||
| 98 | + | ### Понятия | |
| 99 | + | ||
| 100 | + | Пиксели в растровом изображении с прозрачностью хранятся с 4 значениями, здесь 4 байта \[расположены\] в порядке Blue, Green, Red, Alpha. Последний канал определяет уровень непрозрачности (0 означает прозрачный, 255 означает непрозрачный), другие каналы определяют цвет и яркость. | |
| 101 | + | ||
| 102 | + | Есть два основных режима рисования. Первый состоит в замене содержимого информации пикселя, второй состоит в смешении уже имеющегося пикселя с новым, который называется альфа-смешением. | |
| 103 | + | ||
| 104 | + | Функции BGRABitmap предлагают 4 режима: | |
| 105 | + | ||
| 106 | + | - dmSet : заменяет четыре байта нарисованного пикселя, прозрачность не обрабатывается. | |
| 107 | + | - dmDrawWithTransparency : рисует с альфа-каналом и с гамма-коррекцией (см. ниже). | |
| 108 | + | - dmFastBlend или dmLinearBlend : рисует с альфа-каналом, но без гамма-коррекции (быстрее, но влечет за собой искажения цвета с низкой интенсивностью). | |
| 109 | + | - dmXor : применяет Xor к каждому компоненту, включая альфа (если вы хотите инвертировать цвет, но сохранить альфа, используйте BGRA (255,255,255,0)). | |
| 110 | + | ||
| 111 | + | ### Встроенные функции рисования | |
| 112 | + | ||
| 113 | + | - рисование/стирание пикселей | |
| 114 | + | - рисование линии с или без сглаживания | |
| 115 | + | - координаты с плавающей точкой | |
| 116 | + | - ширина пера с плавающей точкой | |
| 117 | + | - прямоугольник (рамка или заливка) | |
| 118 | + | - эллипс и многоугольники со сглаживанием | |
| 119 | + | - расчет сплайна (скругленная кривая) | |
| 120 | + | - простая заливка (Floodfill) или прогрессивная заливка | |
| 121 | + | - отрисовка цветового градиента (линейная, радиальная ...) | |
| 122 | + | - скругленные прямоугольники | |
| 123 | + | - тексты с прозрачностью | |
| 124 | + | ||
| 125 | + | ### Рисование с помощью холста | |
| 126 | + | ||
| 127 | + | Можно рисовать с помощью объекта *Canvas*, с обычными функциями, но без сглаживания. Непрозрачность рисования определяется свойством *CanvasOpacity*. Этот способ медленнее, потому что он требует преобразования изображения. Если вы можете, используйте вместо этого *CanvasBGRA*, который позволяет \[использовать\] прозрачность и сглаживание, имея те же имена функций, что и в TCanvas. | |
| 128 | + | ||
| 129 | + | ### Прямой доступ к пикселям | |
| 130 | + | ||
| 131 | + | Для доступа к пикселям есть два свойства: *Data* и *Scanline*. Первый дает указатель на первый пиксель изображения, а второй дает указатель на первый пиксель данной строки. | |
| 132 | + | ||
| 133 | + | ``` pascal | |
| 134 | + | var | |
| 135 | + | bmp: TBGRABitmap; | |
| 136 | + | p: PBGRAPixel; | |
| 137 | + | n: integer; | |
| 138 | + | ||
| 139 | + | begin | |
| 140 | + | bmp := TBGRABitmap.Create('image.png'); | |
| 141 | + | p := bmp.Data; | |
| 142 | + | for n := bmp.NbPixels-1 downto 0 do | |
| 143 | + | begin | |
| 144 | + | p^.red := not p^.red; // инвертируем красный канал | |
| 145 | + | inc(p); | |
| 146 | + | end; | |
| 147 | + | bmp.InvalidateBitmap; // обратите внимание, что мы получили доступ к пикселям напрямую | |
| 148 | + | bmp.Draw(Canvas, 0, 0, True); | |
| 149 | + | bmp.Free; | |
| 150 | + | end; | |
| 151 | + | ``` | |
| 152 | + | ||
| 153 | + | Необходимо вызвать функцию *InvalidateBitmap*, чтобы пересобрать изображение, например, при следующем вызове *Draw*. Обратите внимание, что порядок строк может быть обратным, в зависимости от свойства *LineOrder*. | |
| 154 | + | ||
| 155 | + | Смотрите также сравнение между [[Fast direct pixel access|direct pixel access methods]]. | |
| 156 | + | ||
| 157 | + | ### Манипуляции с изображениями | |
| 158 | + | ||
| 159 | + | Доступные фильтры (с префиксом Filter): | |
| 160 | + | ||
| 161 | + | - Radial blur : ненаправленное размытие | |
| 162 | + | - Motion blur : направленное размытие | |
| 163 | + | - Custom blur : размытие по маске | |
| 164 | + | ||
| 165 | + | - Median : вычисляет медиану цветов вокруг каждого пикселя, что смягчает углы | |
| 166 | + | - Pixelate : упрощает изображение с прямоугольниками одного цвета | |
| 167 | + | - Smooth : смягчает все изображение, дополнительно к \[фильтру\] Sharpen | |
| 168 | + | - Sharpen :делает контуры более четкими, дополнительно к \[фильтру\] Smooth | |
| 169 | + | ||
| 170 | + | - Contour : рисует контуры на белом фоне (как карандашный рисунок) | |
| 171 | + | - Emboss : рисует контуры с тенью | |
| 172 | + | - EmbossHighlight : рисует контуры выделения, определенного в оттенках серого | |
| 173 | + | ||
| 174 | + | - Grayscale : преобразует цвета в оттенки серого с гамма-коррекцией | |
| 175 | + | - Normalize : использует весь спектр яркости цвета | |
| 176 | + | ||
| 177 | + | - Rotate : вращение изображения вокруг точки | |
| 178 | + | - Sphere : искажает изображение, чтобы оно выглядело, как проецируемое на сферу | |
| 179 | + | - Twirl : искажает изображение с эффектом закручивания | |
| 180 | + | - Cylinder : искажает изображение, чтобы оно выглядело, как проецируемое на цилиндр | |
| 181 | + | - Plane : вычисляет проекцию с высокой точностью на горизонтальную плоскость. Это довольно медленно. | |
| 182 | + | - SmartZoom3 : изменяет размер изображения х3 и определяет границы, чтобы иметь полезный зум с древними игровыми спрайтами | |
| 183 | + | ||
| 184 | + | Некоторые функции не имеют префикса Filter, потому что они не возвращают вновь выделенное изображение. Они изменяют изображение на месте: | |
| 185 | + | ||
| 186 | + | - VerticalFlip : переворачивает изображение по вертикали | |
| 187 | + | - HorizontalFlip : переворачивает изображение по горизонтали | |
| 188 | + | - Negative : инвертирует цвета | |
| 189 | + | - LinearNegative : инверсия без гамма-коррекции | |
| 190 | + | - SwapRedBlue : меняет местами красный и синий каналы (для конвертации между BGRA и RGBA) | |
| 191 | + | - ConvertToLinearRGB : конвертирует из sRGB в RGB. Обратите внимание, что формат, используемый BGRABitmap - **sRGB** при использовании *dmDrawWithTransparency* и **RGB** при использовании *dmLinearBlend*. | |
| 192 | + | - ConvertFromLinearRGB : конвертирует из RGB в sRGB. | |
| 193 | + | ||
| 194 | + | ### Сочетание изображений | |
| 195 | + | ||
| 196 | + | PutImage является основной функцией рисования изображений, а BlendImage позволяет комбинировать изображения, как слои программ для редактирования изображений. Доступны следующие режимы: | |
| 197 | + | ||
| 198 | + | - LinearBlend : простое наложение без гамма-коррекции (эквивалент dmFastBlend) | |
| 199 | + | - Transparent : наложение с гамма-коррекцией | |
| 200 | + | - Multiply : умножение значений цвета (с гамма-коррекцией) | |
| 201 | + | - LinearMultiply : умножение значений цвета (без гамма-коррекции) | |
| 202 | + | - Additive : добавление значений цвета (с гамма-коррекцией) | |
| 203 | + | - LinearAdd : добавление значений цвета (без гамма-коррекции) | |
| 204 | + | - Difference : разница значений цвета (с гамма-коррекцией) | |
| 205 | + | - LinearDifference : разница значений цвета (без гамма-коррекции) | |
| 206 | + | - Negation : устранение общих цветов (с гамма-коррекцией) | |
| 207 | + | - LinearNegation : исчезновение общих цвета (без гамма-коррекции) | |
| 208 | + | - Reflect, Glow : для световых эффектов | |
| 209 | + | - ColorBurn, ColorDodge, Overlay, Screen : разные фильтры | |
| 210 | + | - Lighten : сохраняет самые светлые цветовые значения | |
| 211 | + | - Darken : сохраняет самые темные значения цвета | |
| 212 | + | - Xor : исключающее ИЛИ цветовых значений | |
| 213 | + | ||
| 214 | + | Эти режимы можно использовать в TBGRALayeredBitmap, что упрощает эту задачу, поскольку BlendImage предоставляет только основные операции смешивания. | |
| 215 | + | ||
| 216 | + | ### Скриншоты | |
| 217 | + | ||
| 218 | + | - <figure> | |
| 219 | + | <img src="Lazpaint_contour.png" title="Lazpaint_contour.png" /> | |
| 220 | + | <figcaption>Lazpaint_contour.png</figcaption> | |
| 221 | + | </figure> | |
| 222 | + | ||
| 223 | + | \ | |
| 224 | + | * \ | |
| 225 | + | * \ | |
| 226 | + | * \ | |
| 227 | + | ||
| 228 | + | ### Лицензия | |
| 229 | + | ||
| 230 | + | модифицированная LGPL | |
| 231 | + | ||
| 232 | + | Автор: [Johann ELSASS](http://johann-elsass.net) ([Facebook](http://www.facebook.com/johann.elsass.1)) | |
| 233 | + | ||
| 234 | + | ### Скачать | |
| 235 | + | ||
| 236 | + | Последняя версия: <https://github.com/bgrabitmap/bgrabitmap/releases> | |
| 237 | + | ||
| 238 | + | Sourceforge with [[LazPaint]]: <http://sourceforge.net/projects/lazpaint/files/src/> | |
| 239 | + | ||
| 240 | + | GitHub: <https://github.com/bgrabitmap/> | |
| 241 | + | ||
| 242 | + | --- | |
| 243 | + | *From the Free Pascal wiki, page "BGRABitmap/ru", as it stood on 2022-09-11 after a change by Circular, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).* |
