WinForms Bitmap с полной поддержкой альфа-канала - PullRequest
1 голос
/ 25 апреля 2019

Когда я рисую на растровой графике изображение с полупрозрачными пикселями, а затем рисую растровое изображение на экране, эти пиксели становятся черными.

В то же время чисто прозрачные пиксели вокруг изображения остаются прозрачными.

Кто знает, как это исправить?

Вот код:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Windows.Forms.VisualStyles;
using System.Drawing.Drawing2D;

namespace SimpleTest
{
  public partial class Form12_BitmapAlpha : Form
  {
    public Form12_BitmapAlpha()
    {
      InitializeComponent();
    }

    private void Panel1_Paint(object sender, PaintEventArgs e)
    {
      //Back
      e.Graphics.FillRectangle(new SolidBrush(Color.Coral), new Rectangle(5, 5, 25, 85));

      // 1
      RadioButtonRenderer.DrawRadioButton(e.Graphics, new Point(10, 10), RadioButtonState.CheckedNormal);

      //2
      Size cbSize = RadioButtonRenderer.GetGlyphSize(e.Graphics, RadioButtonState.CheckedNormal);
      Bitmap cbBitmap = new Bitmap(cbSize.Width, cbSize.Height);

      using (Graphics offscreen = Graphics.FromImage(cbBitmap))
      {
        //offscreen.CompositingMode = CompositingMode.SourceCopy; //doesn't work
        //offscreen.Clear(Color.Transparent); //it doesn't help
        RadioButtonRenderer.DrawRadioButton(offscreen, new Point(0, 0), RadioButtonState.CheckedNormal);
      }

      e.Graphics.DrawImage(cbBitmap, new Point(10, 40));

      //3
      RadioButtonRenderer.DrawRadioButton(e.Graphics, new Point(10, 70), RadioButtonState.CheckedNormal);
      Bitmap cbBitmap1 = new Bitmap(20, 20);

      using (Graphics offscreen = Graphics.FromImage(cbBitmap1))
      {
        offscreen.FillRectangle(new SolidBrush(Color.FromArgb(128, Color.Red)), new Rectangle(2, 2, 16, 16));
      }

      e.Graphics.DrawImage(cbBitmap1, new Point(0, 65));
    }
  }
}

В первой части кода (под // 1) я рисую напрямуюна графике панели, и вы можете видеть, что края RadioButton нарисованы полупрозрачным цветом.

Во второй части кода (под // 2) я рисую то же самое, но через растровый объект.Здесь граница нарисована черным.

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

и результат

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...