Sign in Join
Wiki copytemporary

BGRABitmap/ru: what changed

Revision 3 to 4. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
11См.также: [[Developing with Graphics/ru|Developing with Graphics]]
22
33### Описание
44
55**BGRABitmap** - это набор модулей, предназначенных для изменения и создания изображений с прозрачностью (альфа-канал). Прямой пиксельный доступ позволяет быстро обрабатывать изображения. Библиотека была протестирована на Windows, Ubuntu и Mac OS X (последняя версия не работает на Mac), с наборами виджетов win32, gtk1, gtk2 и carbon.
66
77Основным классом является [[TBGRABitmap class|TBGRABitmap]], который является производным от [[fcl-image|TFPCustomImage]]. Существует также [[TBGRAPtrBitmap class|TBGRAPtrBitmap]], позволяющий редактировать данные BGRA, которые уже распределены. Этот формат состоит из 4 байтов для каждого пикселя (синий, зеленый, красный и альфа в этом порядке).
88
99Изображение может быть отображено на обычном Canvas или на [[BGRABitmap and OpenGL|OpenGL surface]].
1010
1111### Дополнительные пакеты
1212
1313Некоторые пакеты используют BGRABitmap для обеспечения элементов управления приятной графикой:
1414
1515- BGLControls: предоставляет TBGLVirtualScreen для рисования на поверхности OpenGL. Этот пакет находится в архиве BGRABitmap.
1616- [[BGRAControls]]: ярлыки с тенями, красивыми кнопками, фигурами и т.д.
1717- [[uE Controls]]: датчики, светодиоды и т.д.
1818- [[Material Design]]: Компоненты пользовательского интерфейса, основанные на принципах разработки материалов Google.
1919- BGRAControlsFX[1](https://forum.lazarus.freepascal.org/index.php?topic=34534.0): элементы управления рендеринга на поверхности OpenGL.
2020
2121Некоторые примеры в папке с примерами используют BGRAControls и BGLControls. Вам может понадобиться установить их, чтобы открыть эти проекты в Lazarus. См. [[Install Packages]].
2222
2323### Использование BGRABitmap
2424
2525#### Руководства
2626
2727- [Как конвертировать приложение из TCanvas в BGRABitmap(англ.)](http://www.youtube.com/watch?v=HGYSLgtYx-U)
2828- [[BGRABitmap tutorial TAChart|Using BGRABitmap to render a TAChart]]
2929- [[BGRABitmap tutorial|A series of tutorials to learn step by step]]
3030- Примеры на [GitHub](https://github.com/bgrabitmap).
3131- [Цикл уроков по компоненту BGRABitmap](http://dropdoc.ru/Zyr2) от пользователя [sign](http://www.freepascal.ru/forum/memberlist.php?mode=viewprofile&u=9593)
3232
3333#### Обзор
3434
3535Функции имеют длинные имена, чтобы быть понятными. Почти все доступно в виде функции или с помощью свойства объекта [[TBGRABitmap class|TBGRABitmap]]. Например, вы можете использовать CanvasBGRA, чтобы иметь некоторые холсты, похожие на TCanvas (с прозрачностью и сглаживанием) и Canvas2D, чтобы иметь те же функции, что и [HTML canvas](https://developer.mozilla.org/en/HTML:Canvas).
3636
3737Некоторые специальные функции требуют использования модулей, но они могут вам не понадобиться:
3838
3939- TBGRAMultishapeFiller иметь сглаженные соединения многоугольников в BGRAPolygon
4040- TBGRATextEffect в BGRATextFX
4141- 2D преобразования находятся в BGRATransform
4242- TBGRAScene3D в BGRAScene3D
4343- Если вам нужны слои, BGRALayers предоставляет TBGRALayeredBitmap
4444
4545Двойная буферизация на самом деле не является частью BGRABitmap, потому что она больше о том, как обрабатывать формы. Для двойной буферизации вы можете использовать TBGRAVirtualScreen, который находится в пакете [[BGRAControls]]. Кроме того, двойная буферизация в BGRABitmap работает как любая двойная буферизация. Вам нужно иметь растровое изображение, в котором вы храните свой чертеж и которое вы отображаете с помощью одной инструкции Draw.
4646
4747#### Ссылка на модуль BGRABitmapTypes
4848
4949- [[BGRABitmap Pixel types/ru|Pixel types and functions]]: *TBGRAPixel*, *THSLAPixel*...
5050- [[BGRABitmap Types imported from Graphics|Types imported from Graphics]]: *TColor*, стиль пера...
5151- [[BGRABitmap Color definitions|Color definitions]]: *VGAColors*, *CSSColors*...
5252- [[BGRABitmap Geometry types|Geometry types]]: *TPointF*, кривые Берзье, *TArcDef*...
5353- [[BGRABitmap Miscellaneous types|Miscellaneous types]]: шрифт, формат изображения, ресэмплинг...
5454- [[TBGRACustomBitmap and IBGRAScanner]]: базовый класс для TBGRABitmap и сканеров
5555
5656#### Установка
5757
5858После распаковки архива BGRA часто не компилируется в Linux. Попробуйте использовать макрос IDE
5959
60-` LCLWidgetType:=gtk2`
60+``` pascal
61+ LCLWidgetType:=gtk2
62+```
6163
6264в таких случаях. Тем не менее, некоторые другие части могут не скомпилироваться.
6365
6466#### Простой пример
6567
6668Создайте проект и откройте bgrabitmappackage.lpk с помощью Lazarus. В окне пакета нажмите "Use \> Add to Project". Затем в исходном коде основного файла (основная форма или основная программа) добавьте в раздел uses модуль BGRABitmap. Вам также может понадобиться добавить модуль BGRAGraphics, если вы используете определенные типы, которые унаследованы от LCL.
6769
6870``` pascal
6971Uses
7072 Classes, SysUtils, BGRABitmap, BGRABitmapTypes;
7173```
7274
7375Модуль BGRABitmapTypes содержит общие определения, но можно объявить только BGRABitmap для загрузки и отображения растрового изображения. Затем первым шагом является создание объекта [[TBGRABitmap class|TBGRABitmap]]:
7476
7577``` pascal
7678var
7779 bmp: TBGRABitmap;
7880begin
7981 bmp := TBGRABitmap.Create(100, 100, BGRABlack); // создаем изображение размером 100x100 пикселей с черным фоном
8082
8183 bmp.FillRect(20, 20, 60, 60, BGRAWhite, dmSet); // рисуем белый квадрат без прозрачности
8284 bmp.FillRect(40, 40, 80, 80, BGRA(0, 0, 255, 128), dmDrawWithTransparency); // рисуем прозрачный синий квадрат
8385 ...
8486end;
8587```
8688
8789Наконец, чтобы показать растровое изображение:
8890
8991``` pascal
9092procedure TFMain.FormPaint(Sender: TObject);
9193begin
9294 bmp.Draw(Canvas, 0, 0, True); // рисуем растровое изображение в непрозрачном режиме (быстрее)
9395end;
9496```
9597
9698Смотрите полный исходный код в [[BGRABitmap tutorial 1|tutorial 1]].
9799
98100### Понятия
99101
100102Пиксели в растровом изображении с прозрачностью хранятся с 4 значениями, здесь 4 байта \[расположены\] в порядке Blue, Green, Red, Alpha. Последний канал определяет уровень непрозрачности (0 означает прозрачный, 255 означает непрозрачный), другие каналы определяют цвет и яркость.
101103
102104Есть два основных режима рисования. Первый состоит в замене содержимого информации пикселя, второй состоит в смешении уже имеющегося пикселя с новым, который называется альфа-смешением.
103105
104106Функции BGRABitmap предлагают 4 режима:
105107
106108- dmSet : заменяет четыре байта нарисованного пикселя, прозрачность не обрабатывается.
107109- dmDrawWithTransparency : рисует с альфа-каналом и с гамма-коррекцией (см. ниже).
108110- dmFastBlend или dmLinearBlend : рисует с альфа-каналом, но без гамма-коррекции (быстрее, но влечет за собой искажения цвета с низкой интенсивностью).
109111- dmXor : применяет Xor к каждому компоненту, включая альфа (если вы хотите инвертировать цвет, но сохранить альфа, используйте BGRA (255,255,255,0)).
110112
111113### Встроенные функции рисования
112114
113115- рисование/стирание пикселей
114116- рисование линии с или без сглаживания
115117- координаты с плавающей точкой
116118- ширина пера с плавающей точкой
117119- прямоугольник (рамка или заливка)
118120- эллипс и многоугольники со сглаживанием
119121- расчет сплайна (скругленная кривая)
120122- простая заливка (Floodfill) или прогрессивная заливка
121123- отрисовка цветового градиента (линейная, радиальная ...)
122124- скругленные прямоугольники
123125- тексты с прозрачностью
124126
125127### Рисование с помощью холста
126128
127129Можно рисовать с помощью объекта *Canvas*, с обычными функциями, но без сглаживания. Непрозрачность рисования определяется свойством *CanvasOpacity*. Этот способ медленнее, потому что он требует преобразования изображения. Если вы можете, используйте вместо этого *CanvasBGRA*, который позволяет \[использовать\] прозрачность и сглаживание, имея те же имена функций, что и в TCanvas.
128130
129131### Прямой доступ к пикселям
130132
131133Для доступа к пикселям есть два свойства: *Data* и *Scanline*. Первый дает указатель на первый пиксель изображения, а второй дает указатель на первый пиксель данной строки.
132134
133135``` pascal
134136var
135137 bmp: TBGRABitmap;
136138 p: PBGRAPixel;
137139 n: integer;
138140
139141begin
140142 bmp := TBGRABitmap.Create('image.png');
141143 p := bmp.Data;
142144 for n := bmp.NbPixels-1 downto 0 do
143145 begin
144146 p^.red := not p^.red; // инвертируем красный канал
145147 inc(p);
146148 end;
147149 bmp.InvalidateBitmap; // обратите внимание, что мы получили доступ к пикселям напрямую
148150 bmp.Draw(Canvas, 0, 0, True);
149151 bmp.Free;
150152end;
151153```
152154
153155Необходимо вызвать функцию *InvalidateBitmap*, чтобы пересобрать изображение, например, при следующем вызове *Draw*. Обратите внимание, что порядок строк может быть обратным, в зависимости от свойства *LineOrder*.
154156
155157Смотрите также сравнение между [[Fast direct pixel access|direct pixel access methods]].
156158
157159### Манипуляции с изображениями
158160
159161Доступные фильтры (с префиксом Filter):
160162
161163- Radial blur : ненаправленное размытие
162164- Motion blur : направленное размытие
163165- Custom blur : размытие по маске
164166
165167- Median : вычисляет медиану цветов вокруг каждого пикселя, что смягчает углы
166168- Pixelate : упрощает изображение с прямоугольниками одного цвета
167169- Smooth : смягчает все изображение, дополнительно к \[фильтру\] Sharpen
168170- Sharpen :делает контуры более четкими, дополнительно к \[фильтру\] Smooth
169171
170172- Contour : рисует контуры на белом фоне (как карандашный рисунок)
171173- Emboss : рисует контуры с тенью
172174- EmbossHighlight : рисует контуры выделения, определенного в оттенках серого
173175
174176- Grayscale : преобразует цвета в оттенки серого с гамма-коррекцией
175177- Normalize : использует весь спектр яркости цвета
176178
177179- Rotate : вращение изображения вокруг точки
178180- Sphere : искажает изображение, чтобы оно выглядело, как проецируемое на сферу
179181- Twirl : искажает изображение с эффектом закручивания
180182- Cylinder : искажает изображение, чтобы оно выглядело, как проецируемое на цилиндр
181183- Plane : вычисляет проекцию с высокой точностью на горизонтальную плоскость. Это довольно медленно.
182184- SmartZoom3 : изменяет размер изображения х3 и определяет границы, чтобы иметь полезный зум с древними игровыми спрайтами
183185
184186Некоторые функции не имеют префикса Filter, потому что они не возвращают вновь выделенное изображение. Они изменяют изображение на месте:
185187
186188- VerticalFlip : переворачивает изображение по вертикали
187189- HorizontalFlip : переворачивает изображение по горизонтали
188190- Negative : инвертирует цвета
189191- LinearNegative : инверсия без гамма-коррекции
190192- SwapRedBlue : меняет местами красный и синий каналы (для конвертации между BGRA и RGBA)
191193- ConvertToLinearRGB : конвертирует из sRGB в RGB. Обратите внимание, что формат, используемый BGRABitmap - **sRGB** при использовании *dmDrawWithTransparency* и **RGB** при использовании *dmLinearBlend*.
192194- ConvertFromLinearRGB : конвертирует из RGB в sRGB.
193195
194196### Сочетание изображений
195197
196198PutImage является основной функцией рисования изображений, а BlendImage позволяет комбинировать изображения, как слои программ для редактирования изображений. Доступны следующие режимы:
197199
198200- LinearBlend : простое наложение без гамма-коррекции (эквивалент dmFastBlend)
199201- Transparent : наложение с гамма-коррекцией
200202- Multiply : умножение значений цвета (с гамма-коррекцией)
201203- LinearMultiply : умножение значений цвета (без гамма-коррекции)
202204- Additive : добавление значений цвета (с гамма-коррекцией)
203205- LinearAdd : добавление значений цвета (без гамма-коррекции)
204206- Difference : разница значений цвета (с гамма-коррекцией)
205207- LinearDifference : разница значений цвета (без гамма-коррекции)
206208- Negation : устранение общих цветов (с гамма-коррекцией)
207209- LinearNegation : исчезновение общих цвета (без гамма-коррекции)
208210- Reflect, Glow : для световых эффектов
209211- ColorBurn, ColorDodge, Overlay, Screen : разные фильтры
210212- Lighten : сохраняет самые светлые цветовые значения
211213- Darken : сохраняет самые темные значения цвета
212214- Xor : исключающее ИЛИ цветовых значений
213215
214216Эти режимы можно использовать в TBGRALayeredBitmap, что упрощает эту задачу, поскольку BlendImage предоставляет только основные операции смешивания.
215217
216218### Скриншоты
217219
218220- ![](/wiki-images/5/5d/Lazpaint_contour.png)
219221
220222* ![](/wiki-images/2/25/Lazpaint_curve_redim.png)\
221223* ![](/wiki-images/2/23/Bgra_wirecube.png)\
222224* ![](/wiki-images/b/b0/Bgra_chessboard.jpg)\
223225
224226### Лицензия
225227
226228модифицированная LGPL
227229
228230Автор: [Johann ELSASS](http://johann-elsass.net) ([Facebook](http://www.facebook.com/johann.elsass.1))
229231
230232### Скачать
231233
232234Последняя версия: <https://github.com/bgrabitmap/bgrabitmap/releases>
233235
234236Sourceforge with [[LazPaint]]: <http://sourceforge.net/projects/lazpaint/files/src/>
235237
236238GitHub: <https://github.com/bgrabitmap/>
237239
238240---
239241*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).*

Back to history