2014-01-16 6 views
0

В настоящее время я работаю над рендерером гистограммы, который отображает растровые изображения на холст Grasshopper. Есть в общей сложности два растровых изображений, оба из них описаны нижеПроблемы с отображением растрового изображения

private readonly Bitmap _image;

и:

private readonly Bitmap _overlayedImage;

Bitmap экземпляр с именем _image выглядит следующим образом:

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

Пока t он Bitmap экземпляра с именем _overlayedImage выглядит следующим образом:

enter image description here

В основном, _overlayedImage является растровым, который создается с помощью _image растрового изображения, и, как следует из названия, накладки текста (который вы можете увидеть в изображение, которое я опубликовал) и добавляет к нему черный фон. Это, как он назначен

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

(The * 3 используется для изменения размера изображения).


Проблема, которую я имею в настоящее время, является многократной.

Используя этот метод, я могу визуализировать _image на холсте.

enter image description here

Код выглядит так:

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 пиксель по горизонтали.

Прошу прощения за досудебный вопрос, но я не думаю, что мог бы объяснить его каким-либо другим способом.

+1

Ваших двух растровых изображений имеют разные размеры. Должны ли вы использовать разные карты [i]. Ширина/Высота для рендеринга? (Так как ваш _overlayedImage имеет размер 3 раза) –

+0

Интересно, что когда я пытаюсь выяснить ширину '' '' '' '' '' 'maps', мой' Render() 'даже не вызван вообще, поскольку поведение по умолчанию Grasshopper не вызывает 'Render()', если несоответствие размеров. Любые идеи о том, как найти размеры '_maps'? – theGreenCabbage

+0

О, я понял, как узнать ценность. – theGreenCabbage

ответ

0

Оказывается, есть два вопроса:

В моей основной метод я использовал _overlayedImage.Dispose(), который эффективно разрушил изображение, прежде чем он даже отображается на холсте.

Кроме того, моя проблема изоляции была также правильной. Эта линия привела вещь правильно рендеринг:

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

Итогового компонент:

enter image description here

Смежные вопросы