C # графика рисует прозрачный прямоугольник над областью - PullRequest
1 голос
/ 09 сентября 2011

У меня есть два наложенных друг на друга изображения, и я хочу иметь возможность очистить часть верхнего изображения. Обычно, если я хочу очистить часть изображения, я просто нарисую его цветом фона, выполнив

g.FillRectangle(Brushes.White,x,y,width,height);

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

g.FillRectangle(Brushes.Transparent,x,y,width,height);

но это, кажется, не очищает область от всего его предыдущего содержания. Можно ли как-нибудь сделать пиксели в этой области прозрачными?

Ответы [ 4 ]

3 голосов
/ 13 декабря 2011
//using System.Drawing.Drawing2D;

g.FillRectangle(Brushes.White,x,y,width,height);
g.CompositingMode = CompositingMode.SourceCopy;    
g.FillRectangle(Brushes.Transparent,x,y,width,height);
2 голосов
/ 09 сентября 2011

Другой вариант - не рисовать изображения напрямую. Использование:

System.Windows.Forms.PictureBox

и это собственность

Region

чтобы изменить видимость / прозрачность изображения. Регион не обязательно должен быть прямоугольником. Он может быть определен из любого набора строк.

PS: Brushes.Transparent на самом деле означает не прозрачный, а BackColor родительского контейнера.

2 голосов
/ 09 сентября 2011

Это невозможно.

GDI + и класс Graphics не поддерживают многоуровневое рисование; после перезаписи предыдущего изображения эти пиксели исчезают .

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

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

0 голосов
/ 03 марта 2013
float[][] ptsArray ={
            new float[] {1, 0, 0, 0, 0},
            new float[] {0, 1, 0, 0, 0},
            new float[] {0, 0, 1, 0, 0},
            new float[] {0, 0, 0, 0.5f, 0},
            new float[] {0, 0, 0, 0, 1}};
            ColorMatrix clrMatrix = new ColorMatrix(ptsArray);
            ImageAttributes imgAttributes = new ImageAttributes();
            imgAttributes.SetColorMatrix(clrMatrix,
            ColorMatrixFlag.Default,
            ColorAdjustType.Bitmap);
            _ImageThumb.Height, imgAttributes);
            e.Graphics.DrawImage(_ImageThumb,new Rectangle(0, 0, _ImageThumb.Width,_ImageThumb.Height),0, 0, _ImageThumb.Width, _ImageThumb.Height,GraphicsUnit.Pixel, imgAttributes);

// использовать set clip & region для рисования

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