В настоящее время я работаю над рендерером гистограммы, который отображает растровые изображения на холст Grasshopper. Есть в общей сложности два растровых изображений, оба из них описаны нижеПроблемы с отображением растрового изображения
private readonly Bitmap _image;
и:
private readonly Bitmap _overlayedImage;
Bitmap
экземпляр с именем _image
выглядит следующим образом:
_bitmap http://puu.sh/6mUk4/20b879710a.png
Пока t он Bitmap
экземпляра с именем _overlayedImage
выглядит следующим образом:
В основном, _overlayedImage
является растровым, который создается с помощью _image
растрового изображения, и, как следует из названия, накладки текста (который вы можете увидеть в изображение, которое я опубликовал) и добавляет к нему черный фон. Это, как он назначен
_overlayedImage = overlayBitmap(_image, width * 3, height * 3, times, dates, colors);
(The * 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
возвращается 1
и 100
соответственно, которые по совпадению размеров легенды, которые являются 100 пикселей по вертикали и 1 пиксель по горизонтали.
Прошу прощения за досудебный вопрос, но я не думаю, что мог бы объяснить его каким-либо другим способом.
Ваших двух растровых изображений имеют разные размеры. Должны ли вы использовать разные карты [i]. Ширина/Высота для рендеринга? (Так как ваш _overlayedImage имеет размер 3 раза) –
Интересно, что когда я пытаюсь выяснить ширину '' '' '' '' '' 'maps', мой' Render() 'даже не вызван вообще, поскольку поведение по умолчанию Grasshopper не вызывает 'Render()', если несоответствие размеров. Любые идеи о том, как найти размеры '_maps'? – theGreenCabbage
О, я понял, как узнать ценность. – theGreenCabbage