2013-06-12 4 views
0

Итак, я пытаюсь сделать блок 32x32 обратно прозрачным, но каждый раз, когда я пытаюсь настроить его на прозрачность, он просто держит то, что когда-либо уже существует, я хочу стереть то, что на изображении прозрачно, вот мой код, который я пробовал.Erase to Transparency

public Bitmap erase_tile(Bitmap bitmap, int x, int y) 
    { 
     Graphics device = Graphics.FromImage(bitmap); 

     Brush brush = new SolidBrush(Color.FromArgb(0, Color.White)); 

     device.FillRectangle(brush, new Rectangle(x * 32, y * 32, 32, 32)); 
     return bitmap; 
    } 
+0

вы пробовали 'Graphics.Clear (Color.Transparent)'? –

+0

Прозрачный вид «поддельный» занимает цвет объекта позади него – Sayse

+1

Зависит от того, рисуете ли вы прозрачный цвет или устанавливаете пиксели равными прозрачному цвету. Я не совсем уверен, какой из этих «Graphics.Clear()» делает. –

ответ

1

Вся прозрачность будет осуществляться через функциональность класса Bitmap. Класс Graphics ориентирован на рисунок, а чертеж Color.Transparent по существу не является оператором.

Вы можете использовать Bitmap.SetPixel() с Color.Transparent для установки отдельных пикселей.

Или вы можете сделать что-то вроде этого, где вы используете Graphics, чтобы нарисовать фиктивный цвет, который вы затем проинструктируете растровое изображение использовать в качестве прозрачного цвета.

using (var graphics = Graphics.FromImage(bmp)) 
{ 
    graphics.FillRectangle(Brushes.Red, 0, 0, 64, 64); 
    graphics.FillRectangle(Brushes.Magenta, 16, 16, 32, 32); 
} 
bmp.MakeTransparent(Color.Magenta); 
+0

Хм, я вижу, я могу проверить это немного, я работаю с созданием слоев в данный момент, дайте мне, может быть, 10 минут, и я попробую его –

+0

Спасибо: D Я дам ему тест за секунду :) –

+0

Это работает :) Я бы дал вам +1, но у меня пока нет репутации 15. Спасибо хоть! –

0

Пока я искал то же решение, я не смог найти точный ответ, поэтому после некоторых экспериментов я наткнулся SetCompositingMode и он сделал трюк (см Using Compositing Mode to Control Alpha Blending для подробной информации).

Вот рабочий код в C++, чтобы продемонстрировать подход (он нуждается в некоторой настройке, чтобы повторно использоваться в C#):

void SetTransparent(Gdiplus::Image* image, IN INT x, IN INT y, IN INT width, IN INT height) 
{ 
    Gdiplus::Graphics graph(image); 
    graph.SetCompositingMode(Gdiplus::CompositingModeSourceCopy); 
    Gdiplus::SolidBrush transparent(0); 
    graph.FillRectangle(&transparent, x, y, width, height); 
}