C# GRAPHICS принуждава да презапише пиксел

В момента кодирам прост манипулатор на изображения с C# Bitmaps und Graphics. Използвам costum transparent elemt и работи добре. в моя Draw-Method актуализирам контролата, като рисувам, за да задам изображение:

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 .Graphics.Dispose?   -  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 Не съм наясно с по-голямата среда. Наслоявате ли прозрачен controlx, или сте внедрили персонализиран Bitmap-Designer и симулирате движещи се правоъгълници като спрайт или нещо друго? Може да помогне, ако редактирате оригиналния въпрос, за да ни дадете малко повече информация, ако е възможно. - person tcarvin; 22.06.2012
comment
2-ро. Реших го, като използвах няколко слоя и просто изчистих слоя. Не е чисто, но работи. - person David; 22.06.2012

За да предоставя моето решение официално: реших го с помощта на няколко слоя. Не е чисто, но работи.

person David    schedule 27.08.2012