2009-07-27 56 views
3

我想绘制其他图像而不绘制它的背景。我想绘制它的图像是一颗星星。我想在地图图像上放一些星星。.NET CF 2.0:在具有背景透明度的图像上绘制PNG

问题是,明星的图像有一个白色的背景,当我在地图上画白色背景时出现。

我画星的方法是这样的:

Graphics graphics = Graphics.FromImage(map); 
Image customIcon = Image.FromFile("../../star.png"); 
graphics.DrawImage(customIcon, x, y); 

我试着用透明化背景图片(PNG和GIF格式),它总是吸引周围的明星东西。我如何绘制一个没有背景的明星?

该程序适用于Windows Mobile 5.0及更高版本,Compact Framework 2.0 SP2和C#。

我试着用这个代码:

Graphics g = Graphics.FromImage(mapa); 
Image iconoPOI = (System.Drawing.Image)Recursos.imagenPOI; 
Point iconoOffset = new Point(iconoPOI.Width, iconoPOI.Height); 

System.Drawing.Rectangle rectangulo; 
ImageAttributes transparencia = new ImageAttributes(); 
transparencia.SetColorKey(Color.White, Color.White); 

rectangulo = new System.Drawing.Rectangle(x, y, iconoPOI.Width, iconoPOI.Height); 
g.DrawImage(iconoPOI, rectangulo, x, y, iconoPOI.Width, iconoPOI.Height, GraphicsUnit.Pixel, transparencia); 

但我没有看到任何地图。

Xÿ在哪里我要画它是一个PNG imagen画质与白色背景iconoPOI德坐标。

谢谢!

+0

此外,您的星形图像的背景可能不是纯白色,这会弄乱透明效果。 – MusiGenesis 2009-07-27 12:07:38

回答

0

通常这个任务很复杂(你必须点击windows API BitBlt函数并创建一个黑白蒙版图像和其他东西),但是这里有一个简单的方法来完成它。

假设你有一个位图作为背景图片(bmpMap),一个用于您的星图(bmpStar),你需要画在(X偏移,Y偏移)的明星,这种方法会做你需要的东西:

for (int x = 0; x < bmpStar.Width; x++) 
{ 
    for (int y = 0; y < bmpStar.Height; y++) 
    { 
     Color pixel = bmpStar.GetPixel(x, y); 
     if (pixel != Color.White) 
     { 
      bmpMap.SetPixel(x + xoffset, y + yoffset, pixel); 
     } 
    } 
} 

SetPixel和GetPixel非常慢(首选的方法是使用位图的LockBits方法 - 这里有关于SO的问题解释了如何使用它),但这会让你开始。