Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Делаем часть изображения прозрачной в Delphi под Android: альтернатива Control.MakeScreenShot

Delphi , Графика и Игры , OpenGL

В статье мы рассмотрим, как сделать часть изображения прозрачной в Delphi под Android, альтернативу методу Control.MakeScreenShot. Мы столкнемся с проблемой, когда нам нужно сделать прозрачным определенный участок битмапа, например, закругленный угол, как на приведенном ниже рисунке:

Пример изображения, которое мы хотим сделать прозрачным

Битмап генерируется с помощью Control.MakeScreenShot. Попытка заменить все пиксели верхнего левого угла на прозрачные с помощью цикла была неэффективной, так как инструкция fScreenShot.Map(TMapAccess.ReadWrite, M) занимает слишком много времени (около 200 миллисекунд).

После некоторых исследований мы нашли альтернативный способ сделать часть изображения прозрачной, используя свойство Canvas.blending. Однако, этот метод работал только для прямоугольных областей и не мог быть применен к нашему конкретному случаю.

В итоге, мы нашли решение, которое кажется очень сложным для такой простой задачи. Вот как мы это сделали:

{$IF defined(IOS) or defined(android)}
type
  _TcustomCanvasGPUProtectedAccess = class(TcustomCanvasGPU);
{$ENDIF}

{$IF defined(IOS) or defined(android)}
procedure ClearRoundCorner(const aCanvas: Tcanvas; const ARect: TRectF; const ACorner: TCorner);

const
  MinFlatDistance = 4;

var
  Vertices: TCanvasHelper.TVertexArray;
  Colors: TCanvasHelper.TAlphaColorArray;
  Indices: TCanvasHelper.TIndexArray;
  Index, SubdivCount, VertexCount: Integer;
  Offset: integer;
  Angle: Single;
  Radius: TPointF;
  Center, CurPt, OriPt: TPointF;

begin
  Radius.X := ARect.Width;
  Radius.Y := ARect.Height;

  SubdivCount := (Max(Ceil(2 * Pi * Max(Radius.X, Radius.Y) / MinFlatDistance), 40) div 4) * 4; // https://quality.embarcadero.com/browse/RSP-15206
  VertexCount := (SubdivCount div 4) + 1;

  case ACorner of
    TCorner.BottomRight: begin
                           Offset := 0;
                           Center.X := ARect.left;
                           Center.Y := ARect.top;
                           OriPt.X := ARect.left + aRect.width;
                           OriPt.Y := ARect.bottom + aRect.height;
                         end;
    TCorner.BottomLeft: begin
                         Offset := (SubdivCount div 4);
                         Center.X := ARect.Right;
                         Center.Y := ARect.top;
                         OriPt.X := ARect.left - aRect.width;
                         OriPt.Y := ARect.bottom + aRect.height;
                       end;
    TCorner.TopLeft: begin
                      Offset := (SubdivCount div 4) * 2;
                      Center.X := ARect.right;
                      Center.Y := ARect.bottom;
                      OriPt.X := ARect.left - ARect.width;
                      OriPt.Y := ARect.top - aRect.height;
                    end;
    TCorner.TopRight: begin
                       Offset := (SubdivCount div 4) * 3;
                       Center.X := ARect.left;
                       Center.Y := ARect.Bottom;
                       OriPt.X := ARect.right + aRect.width;
                       OriPt.Y := ARect.top - aRect.height;
                     end;
  end;

  SetLength(Vertices, 1 + VertexCount);
  SetLength(Colors, 1 + VertexCount);
  SetLength(Indices, VertexCount * 3);

  CurPt := OriPt;

  // ... (остальной код)

  CanvasHelper.FillTriangles(Vertices, Colors, Indices, Length(Vertices), VertexCount);
end;
{$ENDIF}

В этом коде мы используем CanvasHelper.FillTriangles для заполнения треугольников, которые образуют прозрачный участок. Мы рассчитываем вершины, цвета и индексы для этих треугольников в зависимости от угла, который мы хотим сделать прозрачным. Затем мы передаем эти данные в CanvasHelper.FillTriangles, чтобы заполнить треугольники прозрачным цветом.

Хотя это решение кажется очень сложным, оно позволяет нам сделать часть изображения прозрачной в Delphi под Android, не используя Control.MakeScreenShot.

Создано по материалам из источника по ссылке.

В статье рассматривается решение задачи по созданию прозрачного участка на битмапе в Delphi под Android, альтернативное методу Control.MakeScreenShot.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: OpenGL ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 18:12:53/0.003309965133667/0