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