C# GRAPHICS принудительно перезаписывает пиксель

В настоящее время я кодирую простой манипулятор изображений с C# Bitmaps und Graphics. Я использую прозрачный элемент костюма, и он отлично работает. в моем методе рисования я обновляю элемент управления, рисуя, чтобы установить изображение:

ImageAttributes attr = new ImageAttributes();  
attr.SetColorKey(this.transpKey, this.transpKey);  
Rectangle dstRect = new Rectangle(0, 0, this.image.Width, this.image.Height);  
e.Graphics.DrawImage(this.image, dstRect, 0, 0, this.image.Width, this.image.Height, GraphicsUnit.Pixel, attr);  
e.Graphics.Dispose();

Теперь мне нужна функция для стирания некоторых пикселей. Используя форму и рисунок на BackgroindImage, я могу «стереть» пиксели с помощью TransparencyKey-Prperty. Но это свойство не существует в моем контроле над костюмом. Вот почему я использовал «attr.SetColorKey (this.transpKey, this.transpKey);», но есть проблема. Это просто делает пиксель прозрачным, а лежащие в его основе пиксели будут видны.
Кто-нибудь знает, как заставить C# заменять пиксели вместо того, чтобы оставлять их? Или кто-нибудь знает решение моей проблемы?
Большое спасибо, что читаете, думаете и, возможно, помогаете.

// Редактировать: ОК, теперь я узнал, что могу использовать "e.Graphics.CompositingMode = CompositingMode.SourceCopy;" установить, что пиксель должен быть заменен. Но после этого прозрачность разрушается. И результат тот же. Ничего не стерто. Любые решения?


person David    schedule 21.06.2012    source источник
comment
Я не уверен на 100%, что вы хотите, но не могли бы вы вызвать e.Graphics.DrawRectangle с прямоугольником размером 1x1, чтобы перезаписать любой пиксель, который вы хотите перезаписать, после вызова e.Graphics.DrawImage, но до вызова e .Графика.Распоряжаться?   -  person ekolis    schedule 21.06.2012
comment
Нет. Во-первых, мне это не помогло бы, потому что текст, линия, прямоугольник или пиксель, которые я хочу стереть, уже перерисованы. И в этом проблема. Не могу стереть нарисованные пиксели. Я попробовал перерисовать пиксели, как будто вы используете резину, а затем сделать их прозрачными с помощью ImageAttribute. Но есть вышеупомянутая проблема, что пиксели, которые я хочу стереть, не стираются.   -  person David    schedule 21.06.2012


Ответы (3)


СТИРАНИЕ отсутствует, потому что элементы управления отрисовываются один за другим, используя z-порядок в качестве порядка отрисовки. Сначала рисуется фон формы, затем метки, затем ваш элемент управления. Нет никаких СЛОЕВ, как только что-то нарисовано, это останется.

Единственный способ «СТЕРЕТЬ» что-то — это найти способ для элементов управления, находящихся ПОД вашим контролем, перерисовать себя в какой-то ваш буфер, который вы могли бы использовать.

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

Извините за плохие новости, надеюсь, что вы получите некоторое представление о моем опыте.

person Daniel Mošmondor    schedule 21.06.2012
comment
Я использую элемент управления костюмом и перерисовываю его каждое событие рисования;). Мой вопрос касается System.Drawing.Graphics/Bitmap. Элементы управления в порядке. - person David; 21.06.2012

Каково ваше определение слова "стирать"? Для меня это означает изменение цвета на цвет фона. Не используйте для этого прозрачность, просто визуализируйте область цветом фона.

person tcarvin    schedule 21.06.2012
comment
Стереть означает для меня, что у меня снова есть прозрачность. Решение с цветом бесполезно, потому что у меня есть исходное изображение в фоновом режиме. Причина, по которой я так этого хочу, заключается в том, что вы можете рисовать линии и прямоугольники, которые можно перетаскивать. И каждое движение мыши рисует новую область. И эту область нужно стереть. - person David; 21.06.2012
comment
@user1141147 user1141147 Я не совсем понимаю более крупную среду. Вы наслаиваете прозрачный controlx или реализовали собственный Bitmap-Designer и имитируете движущиеся прямоугольники, как спрайт, или что-то еще? Может помочь, если вы отредактируете исходный вопрос, чтобы дать нам всем больше информации, если это возможно. - person tcarvin; 22.06.2012
comment
2-й. Я решил это, используя несколько слоев и просто очистив слой. Не чисто, но работает. - person David; 22.06.2012

Чтобы официально предоставить свое решение: я решил его, используя несколько слоев. Не чисто, но работает.

person David    schedule 27.08.2012