使用DrawImage和Color.Transparent时出现奇怪的行为

时间:2013-03-12 01:51:53

标签: c# graphics colors transparent

我正在编写一个十六进制地图创建程序。它基本上像一个绘图程序,我可以用我选择制作地图的图像或颜色绘制每个十六进制。我试图拥有透明的六边形,这样我就可以制作出不同形状和大小的地图,而不仅仅是正方形。但是当我创建一个包含所有透明六边形的地图时,当我绘制任何十六进制时,其右边的所有六边形,然后向下,对于地图的其余部分采用相同的图像。

这就是我的期望:

enter image description here

但这就是我得到的:

enter image description here

这是绘制地图的代码:

 internal static Bitmap Create(Map map, Rectangle visibleArea, Color penColor = default(Color))
    {
        var visibleAreaF = new RectangleF(visibleArea.X, visibleArea.Y, visibleArea.Width, visibleArea.Height);

        var mapImage = new Bitmap(visibleArea.Width, visibleArea.Height);
        using (Graphics mapGraphics = Graphics.FromImage(mapImage))
        {
            mapGraphics.SetClip(new RectangleF(new PointF(), visibleArea.Size));

            mapGraphics.Clear(Color.Transparent);
            PointF[] hexagonPoints = HexCalculator.HexagonPoints(map.Radius);
            using (var tileImage = new Bitmap(map.HexSize.Width, map.HexSize.Height))
            {
                using (Graphics tileGraphics = Graphics.FromImage(tileImage))
                {
                    tileGraphics.Clear(Color.Transparent);
                    ClipHexOverflow(tileGraphics, hexagonPoints);
                    foreach (
                        Hex hex in
                            map.Where(
                                hex =>
                                visibleAreaF.Contains(hex.BoundingBox) ||
                                visibleAreaF.IntersectsWith(hex.BoundingBox)))
                    {
                        tileGraphics.DrawImage(Terrain.ReturnTerrainImage(hex.Terrain), 0, 0, map.HexSize.Width,
                                               map.HexSize.Height);
                        DrawBorder(tileGraphics, hexagonPoints, hex, penColor);
                        mapGraphics.DrawImage(tileImage, hex.Location.RemoveOffsetF(visibleArea.Location));
                    }
                }
            }
        }

        return mapImage;
    }

我能够通过在使用SystemColors.ControlDark的代码中创建一个图像来获得我想要的结果,我使用它作为透明地形的十六进制图像,但它一直让我发疯,试图找出为什么我得到第二个结果从上图。我逐步完成了代码,并为tileGraphics.DrawImage调用得到了正确的hex.Terrain,但是就像它将以前的非透明图像保存在内存中一样。

0 个答案:

没有答案