0

我目前正在研究将位图渲染到 Grasshopper 画布上的直方图渲染器。一共有两个位图,下面分别解释

private readonly Bitmap _image;

和:

private readonly Bitmap _overlayedImage;

具有名称的Bitmap实例_image如下所示:

_位图 http://puu.sh/6mUk4/20b879710a.png

虽然Bitmap具有名称的实例_overlayedImage如下所示:

在此处输入图像描述

基本上,_overlayedImage是使用位图创建的_image位图,顾名思义,它覆盖了文本(您可以在我发布的图像中看到)并为其添加黑色背景。这是它的分配方式

_overlayedImage = overlayBitmap(_image, width * 3, height * 3, times, dates, colors);

* 3用于调整图像大小)。


我目前遇到的一个问题是多方面的。

使用这种方法,我可以渲染_image到画布上。

在此处输入图像描述

代码是这样的:

    protected override void Render(Grasshopper.GUI.Canvas.GH_Canvas canvas, Graphics graphics, Grasshopper.GUI.Canvas.GH_CanvasChannel channel) {
        // Render the default component.
        base.Render(canvas, graphics, channel);

        // Now render our bitmap if it exists.
        if (channel == Grasshopper.GUI.Canvas.GH_CanvasChannel.Wires) {
            var comp = Owner as KT_HeatmapComponent;
            if (comp == null)
                return;

            List<HeatMap> maps = comp.CachedHeatmaps;
            if (maps == null)
                return;

            if (maps.Count == 0)
                return;

            int x = Convert.ToInt32(Bounds.X + Bounds.Width / 2);
            int y = Convert.ToInt32(Bounds.Bottom + 10);

            for (int i = 0; i < maps.Count; i++) {
                Bitmap image = maps[i].overlayedImage;
                if (image == null)
                    continue;

                Rectangle mapBounds = new Rectangle(x, y, maps[i].Width, maps[i].Height);
                mapBounds.X -= mapBounds.Width / 2;

                Rectangle edgeBounds = mapBounds;

                GH_Capsule capsule = GH_Capsule.CreateCapsule(edgeBounds, GH_Palette.Normal);
                capsule.Render(graphics, Selected, false, false);
                capsule.Dispose();
                graphics.DrawImage(image, mapBounds);
                graphics.DrawRectangle(Pens.Black, mapBounds);

                // some graphics interpolation and bicubic methods

                y = edgeBounds.Bottom - (mapBounds.Height) - 4;
            }
        }
    }

根据是什么comp.CachedHeatmaps;

    private readonly List<HeatMap> _maps = new List<HeatMap>();

    internal List<HeatMap> CachedHeatmaps {
        get { return _maps; }
    }

但是,每当我尝试在 上使用Render()_overlayedImage,我都无法这样做。

我已将问题与Render()方法隔离开来,似乎这条线

Rectangle mapBounds = new Rectangle(x, y, maps[i].Width, maps[i].Height);是主要问题,asmaps[i].Widthmaps[i].Heightreturn1分别100是图例的尺寸,垂直 100 像素,水平 1 像素。


对于这个相当长的问题,我深表歉意,但我认为我无法以任何其他方式解释它。

4

1 回答 1

0

结果发现有两个问题:

在我使用的主要方法中_overlayedImage.Dispose(),它甚至在图像显示到画布上之前就有效地破坏了图像。

此外,我的问题隔离也是正确的。这一行导致事物正确渲染:

Rectangle mapBounds = new Rectangle(x, y, maps[i].overlayedImage.Width, maps[i].overlayedImage.Height);

结果组件:

在此处输入图像描述

于 2014-01-16T18:17:54.573 回答