.NET CF 2.0:在具有背景透明度的图像上绘制PNG

时间:2009-07-27 10:50:07

标签: compact-framework transparency

我想在不绘制背景的情况下在其他地方绘制图像。我要画的图像是一个明星。我想把一些星星放在地图图像上。

问题是星星的图像有白色背景,当我在地图上绘制时会出现白色背景。

我绘制星星的方法是这样的:

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 Y 是我想要绘制iconoPOI的de坐标,它是具有白色背景的PNG图像。

谢谢!

2 个答案:

答案 0 :(得分:1)

可在此处找到一个有效的答案:

Answer

谢谢!

答案 1 :(得分:0)

通常这个任务非常复杂(你必须点击windows API BitBlt函数并创建一个黑白掩码图像和其他东西),但这是一个简单的方法。

假设你的背景图像(bmpMap)有一个位图,而你的星形图像(bmpStar)有一个位图,你需要在(xoffset,yoffset)绘制星形,这个方法可以满足你的需要:

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的问题),但这会让你开始。