我目前正在研究一种直方图渲染器,它将位图渲染到Grasshopper画布上。总共有两个位图,它们都在下面解释
private readonly Bitmap _image;
和
private readonly Bitmap _overlayedImage;
名称为Bitmap
的{{1}}实例如下所示:
_bitmap http://puu.sh/6mUk4/20b879710a.png
名称为_image
的{{1}}实例如下所示:
基本上,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);
分别返回maps[i].Width
和maps[i].Height
,它们恰好是图例的维度,垂直100像素,水平1像素。
我为这个相当长的问题道歉,但我认为我不能用其他方式解释它。
答案 0 :(得分:0)
事实证明有两个问题:
在我的主要方法中,我使用了_overlayedImage.Dispose()
,它在图像显示到画布之前有效地破坏了图像。
另外,我的问题隔离也是正确的。这一行导致事物正确呈现:
Rectangle mapBounds = new Rectangle(x, y, maps[i].overlayedImage.Width, maps[i].overlayedImage.Height);
结果组件: