Sign in Join
Wiki copytemporary

BGRABitmap/ru: what changed

Revision 0 to 1. Removed lines have a minus sign; added lines have a plus sign.

Title: BGRABitmap/ru

OldNewLine
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+* ![](/wiki-images/2/25/Lazpaint_curve_redim.png)\
225+* ![](/wiki-images/2/23/Bgra_wirecube.png)\
226+* ![](/wiki-images/b/b0/Bgra_chessboard.jpg)\
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).*

Back to history