Последние записи
- TChromium (CEF3), сохранение изображений
- Как в Delphi XE обнулить таймер?
- Изменить цвет шрифта TextBox на форме
- Ресайз PNG без потери прозрачности
- Вывод на печать графического файла
- Взаимодействие через командную строку
- Перенести программу из Delphi в Lazarus
- Определить текущую ОС
- Автоматическая смена языка (раскладки клавиатуры)
- Сравнение языков на массивах. Часть 2
Интенсив по Python: Работа с API и фреймворками 24-26 ИЮНЯ 2022. Знаете Python, но хотите расширить свои навыки?
Slurm подготовили для вас особенный продукт! Оставить заявку по ссылке - https://slurm.club/3MeqNEk
Online-курс Java с оплатой после трудоустройства. Каждый выпускник получает предложение о работе
И зарплату на 30% выше ожидаемой, подробнее на сайте академии, ссылка - ttps://clck.ru/fCrQw
16th
Сен
Прозрачность тайлсета в TPNGImage
Posted by obzor under Delphi
Не могу разобраться, почему нет прозрачности при отрисовке на канве.
Загружаю тайлсет tileset.png, в котором есть прозрачность в PNGImage с именем Tileset. Далее рисую на канве компонента PNGImage с именем Surface этой процедурой:
procedure TForm1.DrawTile(const X, Y, Index: Integer);
begin
Surface.Canvas.CopyRect(Bounds(X * TileSize, Y * TileSize, TileSize,
TileSize), Tileset.Canvas, Bounds((Index mod TilesetWidth) * TileSize,
(Index div TilesetWidth) * TileSize, TileSize, TileSize));
end;
…вот так:
procedure TForm1.FormPaint(Sender: TObject);
var
X, Y: Integer;
begin
for Y := 0 to MapHeight - 1 do
for X := 0 to MapWidth - 1 do
begin
DrawTile(X, Y, Map[lrGround][X][Y]);
DrawTile(X, Y, Map[lrObject][X][Y]);
end;
Canvas.Draw(0, 0, Surface);
end;
Ожидается правильная отрисовка с альфа-каналом, но не тут то было.
procedure BitmapToPng(bmp:TBitmap; var Png:TPNGObject);
type
T_RGB=packed record
B,G,R:Byte;
end;
T_RGBA=packed record
B, G, R, A:Byte;
end;
TA_Byte=array [0..65536] of Byte;
PA_Byte=^TA_Byte;
TA_RGB=array [0..65536] of T_RGB;
PA_RGB=^TA_RGB;
TA_RGBA=array [0..65536] of T_RGBA;
PA_RGBA=^TA_RGBA;
var X,Y:Integer;
BmpLine:PA_RGBA;
PngLine:PA_RGB;
PngLineAlpha:PA_Byte;
begin
png.Assign(Bmp);
if Bmp.PixelFormat=pf32bit then
begin
Png.CreateAlpha;
for Y:=0 to bmp.Height-1 do
begin
Pointer(BmpLine):=bmp.ScanLine[Y];
Pointer(PngLine):=png.Scanline[Y];
Pointer(PngLineAlpha):=png.AlphaScanline[Y];
for X:=0 to bmp.Width-1 do
begin
PngLineAlpha[X]:=BmpLine[X].A;
end;
end;
end;
end;
...
Png:=TPngObject.Create;
BitmapToPng(ImageControl.Image.Bitmap, png);
png.CreateAlpha;
Png.Draw(PaintBox1.Canvas, Rect1);
png.Destroy;
...
Похожие статьи
Купить рекламу на сайте за 1000 руб
пишите сюда - alarforum@yandex.ru
Да и по любым другим вопросам пишите на почту
пеллетные котлы
Пеллетный котел Emtas
Наши форумы по программированию:
- Форум Web программирование (веб)
- Delphi форумы
- Форумы C (Си)
- Форум .NET Frameworks (точка нет фреймворки)
- Форум Java (джава)
- Форум низкоуровневое программирование
- Форум VBA (вба)
- Форум OpenGL
- Форум DirectX
- Форум CAD проектирование
- Форум по операционным системам
- Форум Software (Софт)
- Форум Hardware (Компьютерное железо)