Инвертировать кадрирование из (вырезать отверстие в) изображение - PullRequest
0 голосов
/ 28 февраля 2019

Везде, где я смотрю онлайн, я вижу людей, которые пишут о том, как успешно обрезать изображение.Тем не менее, я хочу «обрезать» / очистить дыру в изображении.Я хочу сохранить исходное изображение, но обрезать прямоугольник

enter image description here

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

Ответы [ 2 ]

0 голосов
/ 13 июля 2019

Установка для Graphics свойства *1001* объекта CompositingMode.SourceCopy позволит вашим операциям рисования заменить альфа-значение, а не пропорционально его помечать:

        public static void TestDrawTransparent()
        {
            //This code will, successfully, draw something transparent overwriting an opaque area.
            //More precisely, it creates a 100*100 fully-opaque red square with a 50*50 semi-transparent center.
            using(Bitmap bmp = new Bitmap(100, 100, PixelFormat.Format32bppArgb))
            {
                using(Graphics g = Graphics.FromImage(bmp))
                using(Brush opaqueRedBrush = new SolidBrush(Color.FromArgb(255, 255, 0, 0)))
                using(Brush semiRedBrush = new SolidBrush(Color.FromArgb(128, 255, 0, 0)))
                {
                    g.Clear(Color.Transparent);
                    Rectangle bigRect = new Rectangle(0, 0, 100, 100);
                    Rectangle smallRect = new Rectangle(25, 25, 50, 50);
                    g.CompositingMode = System.Drawing.Drawing2D.CompositingMode.SourceCopy;
                    g.FillRectangle(opaqueRedBrush, bigRect);
                    g.FillRectangle(semiRedBrush, smallRect);
                }
                bmp.Save(@"C:\FilePath\TestDrawTransparent.png", ImageFormat.Png);
            }
        }

В этом коде я сначала рисуюполностью непрозрачный красный квадрат, затем полупрозрачный красный квадрат "над" ним.В результате получается полупрозрачная «дыра» в квадрате:

Red square with semi-transparent center И на черном фоне: The square with semi-transparent hole, on a black background

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

0 голосов
/ 28 февраля 2019

Предполагая, что вы хотите заменить исходные цвета пикселей прозрачностью, вы столкнулись с небольшой проблемой: вы не можете рисовать или заполнять прозрачностью в GDI +.

Но выможно использовать Graphics.Clear(Color.Transparent).

Для этого вы ограничите область, в которой будет рисоваться объект Graphics.Здесь мы можем использовать простой прямоугольник обрезки, но вы можете очистить более сложные фигуры, используя GraphicsPath ..

Пример с использованием растрового изображения bmp:

using (Graphics g = Graphics.FromImage(bmp))
{
    Rectangle crop = new Rectangle(222,222,55,55);
    g.SetClip(crop);
    g.Clear(Color.Transparent);
}
bmp.Save(somefilename, ImageFormat.Png);
...