Создать изображение с прозрачным фоном с помощью GDI +?

Один из способов получить логарифмический коэффициент - это разделить по горизонтали, добавить количество прямоугольников с K 1 с выше разделительной линии, число прямоугольников с K 1 с ниже разделительной линии ( вычисляется рекурсивно), и для каждой горизонтальной ширины (их O(|columns|^2)) количество прямоугольников, которые расширяют некоторую часть выше и некоторую часть ниже разделенной линии с той же фиксированной шириной. Мы вычислим последнее, разбив его на две части из K (максимум с 7 после K ≤ 6, и мы можем захотеть одну нулевую часть). Мы можем выполнить бинарный поиск по фиксированной ширине и нижней или верхней строке вверх или вниз по сумме префикса матрицы, которую мы можем предварительно рассчитать в O(M * N) и получить в O(1).

f(vertical_range) =
  f(top_part) +
  f(bottom_part) +
  NumTopRecs(w, i) * NumBottomRecs(w, k - i)
    where i <- [0...k],
          w <- all O(M^2) widths

Хитрость в том, что в каждом рекурсивном вызове мы поворачиваем половину, переданную в f, так, чтобы горизонтальная разделительная линия становилась вертикальной, что означает, что мы сократили M для нашего вызова (из которого мы нарисуем O(M^2) ширины) в 2.

24
задан Julien Poulin 16 June 2011 в 16:25
поделиться

2 ответа

Звонить Graphics.Clear(Color.Transparent) ну, в общем, очистить изображение. Не забывайте создавать его с форматом пикселя, который имеет альфа-канал, например. PixelFormat.Format32bppArgb. Как это:

var image = new Bitmap(135, 135, PixelFormat.Format32bppArgb);
using (var g = Graphics.FromImage(image)) {
    g.Clear(Color.Transparent);
    g.DrawLine(Pens.Red, 0, 0, 135, 135);
}

Предполагает, что Вы using System.Drawing и System.Drawing.Imaging.

Править: Кажется, что Вам на самом деле не нужно Clear(). Просто создание изображения с альфа-каналом создает пустое (полностью прозрачное) изображение.

37
ответ дан 28 November 2019 в 23:47
поделиться

Это могло бы помочь (что-то, что я бросил вместе, какие наборы фон Windows формирует к прозрачному изображению:

private void TestBackGround()
    {
        // Create a red and black bitmap to demonstrate transparency.            
        Bitmap tempBMP = new Bitmap(this.Width, this.Height);
        Graphics g = Graphics.FromImage(tempBMP);
        g.FillEllipse(new SolidBrush(Color.Red), 0, 0, tempBMP.Width, tempBMP.Width);
        g.DrawLine(new Pen(Color.Black), 0, 0, tempBMP.Width, tempBMP.Width);
        g.DrawLine(new Pen(Color.Black), tempBMP.Width, 0, 0, tempBMP.Width);
        g.Dispose();


        // Set the transparancy key attributes,at current it is set to the 
        // color of the pixel in top left corner(0,0)
        ImageAttributes attr = new ImageAttributes();
        attr.SetColorKey(tempBMP.GetPixel(0, 0), tempBMP.GetPixel(0, 0));

        // Draw the image to your output using the transparancy key attributes
        Bitmap outputImage = new Bitmap(this.Width,this.Height);
        g = Graphics.FromImage(outputImage);
        Rectangle destRect = new Rectangle(0, 0, tempBMP.Width, tempBMP.Height);
        g.DrawImage(tempBMP, destRect, 0, 0, tempBMP.Width, tempBMP.Height,GraphicsUnit.Pixel, attr);


        g.Dispose();
        tempBMP.Dispose();
        this.BackgroundImage = outputImage;

    }
0
ответ дан 28 November 2019 в 23:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: