Как рисовать на холсте с прозрачностью и непрозрачностью?

Обзор

Из библиотеки GR32 я использую TImgView32 для рендеринга сетки, которая будет моим прозрачным фоном, вот так:

enter image description here

Помещенный внутрь TImgView32, у меня есть обычный TImage, где я буду рисовать на холсте, что-то вроде этого:

enter image description here

Задание

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

Я нашел этот вопрос ранее, когда искал:Рисование эллипса непрозрачности в Delphi 2010-Андреас Рейбранд предоставил несколько примеров в его ответе на этот вопрос.

Я посмотрел, что сделал Андреас, и придумал собственную упрощенную попытку, но столкнулся с проблемой. Взгляните на следующие два изображения, первое с прозрачным фоном, а второе с черным фоном, чтобы показать проблему более четко :

enter image description hereenter image description here

. Как вы можете видеть, круг вокруг кисти ()действительно раздражающий квадрат, от которого я не могу избавиться.Все, что должно быть видно, это кисть. Это мой код, используемый для получения тех результатов :

procedure DrawOpacityBrush(ACanvasBitmap: TBitmap; X, Y: Integer;
  AColor: TColor; ASize: Integer; Opacity: Integer);
var
  Bmp: TBitmap;
begin
  Bmp := TBitmap.Create;
  try
    Bmp.SetSize(ASize, ASize);
    Bmp.Transparent := False;

    with Bmp.Canvas do
    begin
      Pen.Color := AColor;
      Pen.Style := psSolid;
      Pen.Width := ASize;
      MoveTo(ASize div 2, ASize div 2);
      LineTo(ASize div 2, ASize div 2);
    end;

    ACanvasBitmap.Canvas.Draw(X, Y, Bmp, Opacity);
  finally
    Bmp.Free;
  end;
end;

procedure TForm1.Image1MouseDown(Sender: TObject; Button: TMouseButton;
  Shift: TShiftState; X, Y: Integer);
begin
  DrawOpacityBrush(Image1.Picture.Bitmap, X, Y, clRed, 50, 85);
end;

, которые производят это на обычном растровом изображении:

enter image description here

Идея, которая у меня была (, основанная на способе Андреаса создания эллипса с непрозрачностью ), заключалась в том, чтобы отобразить типичную кисть на canvas, назначьте его закадровому растровому изображению, а затем перерисуйте его на основное растровое изображение с непрозрачностью. Что работает, за исключением этого раздражающего квадрата по краю.

Как визуализировать кисть с непрозрачностью, как показано на снимках экрана, но без этого квадрата вокруг круга кисти?

Если я установлю Bmp.Transparent := True, белая рамка останется, но непрозрачности больше не будет. Просто сплошной белый квадрат и сплошной красный круг.

11
задан Community 23 May 2017 в 10:30
поделиться