Нарисуйте фигуру в GDI +, которая накладывает непрозрачные пиксели на прозрачность

StackOverflow https://stackoverflow.com/questions/2329898

Вопрос

У меня есть растровое изображение маски (bmpMask), которое я рисую на растровом изображении назначения (bmpDest).Оба растровых изображения имеют альфа-каналы, но уже заполнены непрозрачным содержимым.

Что я хочу сделать, так это создать прозрачные области, используя методы GDI + 'Draw ...' в bmpMask, чтобы bmpDest просвечивал, когда я рисую bmpMask поверх него.

Конечно gMask.DrawLine(Pens.Transparent, 0, y, wMax, y) не вызывает изменений в bmpMask, потому что GDI + работает так, как задумано, и ничего не рисует, когда он прозрачный.Даже при использовании полупрозрачных цветов обновляются только значения r, g, b пикселей bmpMask.

Но что я хочу сделать, так это выпустить метод рисования, который изменит альфа-канал bmpMask, чтобы он был прозрачным при рисовании на bmpDest.Я знаю, что могу сделать это с помощью SetPixel или более быстрых альтернатив unsafe или Marshall, но это привело бы к гораздо более сложному решению.Спасибо.

Это было полезно?

Решение

Нашел "тот" ответ спустя 3 года!

У меня так и не нашлось времени попробовать решение Дэна, поэтому я не хочу отказываться от него, но это делает именно то, что я хочу:

    ' (setting composting mode is the key to getting the transparent
    ' line to actually result in setting the pixels to transparent-
    ' instead of just not drawing anything 'because it's transparent dummy' - 
    ' because it turns off the 'math' that is done to cause transparent
    ' image drawing to occur and just verbatim copies the bits).
    g1.CompositingMode = Drawing2D.CompositingMode.SourceCopy
    g1.DrawLine(Pens.Transparent, 0, y, wMax, y)
    g1.CompositingMode = Drawing2D.CompositingMode.SourceOver

CompostingMode это Ключ!Я, наконец, попытался снова исправить этот недостаток в своей программе, и поиск в Google выдал этот элемент, который не имеет ничего общего с тем, что я искал (эй, Google может читать ваши мысли).

Графика.Рисование изображения слишком медленное для больших изображений?

Замечательно!Теперь 10 баксов говорят, что никто во всем мире никогда этого не читает.755

Другие советы

Насколько мне известно, единственный способ изменить альфа-канал - это, как вы говорите, использовать SetPixel или (конечно, гораздо лучше) указатели.В зависимости от того, что вы пытаетесь сделать, вы мог бы обойдитесь творческим использованием цветовой матрицы.Это позволит вам изменить операцию рисования изображения таким образом, чтобы вы могли менять местами значение R / G / B / A по мере его рисования.Попробуйте это, чтобы получить представление:

        using ( var bmp = new Bitmap( 100, 100 ) )
        using ( var g = Graphics.FromImage( bmp ) )
        using ( var ia = new ImageAttributes() )
        {
            float R = 1;
            float G = 0;
            float B = 0;
            ia.SetColorMatrix( new ColorMatrix( new float[][] {
                new float[] {1, 0, 0, R, 0},
                new float[] {0, 1, 0, G, 0},
                new float[] {0, 0, 1, B, 0},
                new float[] {0, 0, 0, 0, 0},
                new float[] {0, 0, 0, 0, 1}} ) );
            g.Clear( Color.White );
            g.FillEllipse( Brushes.Blue, 10, 10, 30, 30 );
            g.FillEllipse( Brushes.Red, 60, 10, 30, 30 );
            g.FillEllipse( Brushes.Green, 10, 60, 30, 30 );
            g.FillEllipse( Brushes.Black, 60, 60, 30, 30 );
            e.Graphics.DrawImage(
                bmp,
                new Rectangle( 0, 0, 100, 100 ),
                0, 0, 100, 100,
                GraphicsUnit.Pixel,
                ia );
        }

Попробуйте установить R / G / B равным 1 соответственно и посмотреть, как это изменит цвета, которые получаются сплошными / прозрачными.Но, если вы хотите напрямую изменить альфа-канал растрового изображения, вот как это сделать: Изображения с мягкими краями в GDI +.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top