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