渲染位图的问题

时间:2014-01-16 16:46:15

标签: c# canvas graphics bitmap grasshopper

我目前正在研究一种直方图渲染器,它将位图渲染到Grasshopper画布上。总共有两个位图,它们都在下面解释

private readonly Bitmap _image;

private readonly Bitmap _overlayedImage;

名称为Bitmap的{​​{1}}实例如下所示:

_bitmap http://puu.sh/6mUk4/20b879710a.png

名称为_image的{​​{1}}实例如下所示:

enter image description here

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

_overlayedImage

_image用于调整图像大小。)


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

使用此方法,我可以将_overlayedImage = overlayBitmap(_image, width * 3, height * 3, times, dates, colors);渲染到画布上。

enter image description here

代码是这样的:

* 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);分别返回maps[i].Widthmaps[i].Height,它们恰好是图例的维度,垂直100像素,水平1像素。


我为这个相当长的问题道歉,但我认为我不能用其他方式解释它。

1 个答案:

答案 0 :(得分:0)

事实证明有两个问题:

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

另外,我的问题隔离也是正确的。这一行导致事物正确呈现:

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

结果组件:

enter image description here