C# 调整位图对象的物理尺寸

C# 调整位图对象的物理尺寸,c#,bitmap,grasshopper,C#,Bitmap,Grasshopper,我有一个脚本,它根据颜色对象的列表返回热图(它们是从名为Grasshopper的图形“编码”软件中的渐变组件派生的RGB值),如下所示: private void saveBMP(){ _heatmap.Save(Path); // Path is just a string declared somewhere } 下面是我的C#热图绘制方法的摘录,该方法返回一个位图 private Bitmap DrawHeatmap(List<Color> colors

我有一个脚本,它根据颜色对象的
列表返回热图(它们是从名为Grasshopper的图形“编码”软件中的渐变组件派生的RGB值),如下所示:

  private void saveBMP(){
    _heatmap.Save(Path); // Path is just a string declared somewhere
  }

下面是我的C#热图绘制方法的摘录,该方法返回一个
位图

  private Bitmap DrawHeatmap(List<Color> colors, int U, int V){
    colorHeatmapArray = new Color[colors.Count()];

    for(int i = 0; i < colors.Count(); i++){
      colorHeatmapArray[i] = colors[i];
    }

    // Create heatmap image.
    Bitmap map = new Bitmap(U, V, System.Drawing.Imaging.PixelFormat.Format32bppArgb);

    int x = 0;
    int y = 0;

    for(int i = 0; i < colors.Count(); i++){
      Color color = colorHeatmapArray[i];
      map.SetPixel(x, y, color);
      y++;
      if (y >= map.Height){
        y = 0;
        x++;
      }
      if (x >= map.Width){
        break;
      }
    }
    return map;
  }
\u heatmap
是一个实例变量,声明如下:
私有位图\u heatmap,其中我使用
DrawHeatmap()
方法存储了
Bitmap
对象

我在Grasshopper的“画布”上显示图像的方式依赖于某些特定于Grasshopper的方法,特别是这个片段

RectangleF rec = Component.Attributes.Bounds;
rec.X = rec.Right + 10;
rec.Height = Height;
rec.Width = Width;

canvas.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor;
canvas.Graphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half;
canvas.Graphics.DrawImage(_heatmap, GH_Convert.ToRectangle(rec));
canvas.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
canvas.Graphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Default;
canvas.Graphics.DrawRectangle(Pens.Black, GH_Convert.ToRectangle(rec));
但是,当我保存
位图
对象时,我得到的结果是画布上的内容稍微高一点,如下所示:

看起来不太漂亮,是吗


我的问题是-在调用
saveBMP()
方法时,是否有方法操纵
Bitmap
来调整尺寸,使其看起来像画布上的东西?

假设从DrawHeatmap方法的输出设置了_hetmap,然后,在该方法中,其大小应在初始化点设置为U×V像素。保存后,从保存的文件中验证输出文件的大小(即输入DrawHeatmap的U和V值是否与预期的尺寸相同


当您在后一个代码部分中绘制矩形时,是否使用了与前面相同的高度和宽度值?

在谷歌搜索之后,我似乎从中找到了解决方案

具体而言:


我看不出顶部图像与底部图像映射的明显方式。它看起来很相似,顶部图像也像是爱德华·剪刀手画的。不能用酸葡萄酿出好酒,“漂亮”没有任何意义。
矩形f
代码片段是热图在画布上显示的内容。
\u热图
对象不做任何尺寸更改。它永远不会被更改。我的问题是,按
saveBMP()是否有方法操纵
位图
对象的尺寸
?我不确定我在这里的措辞是否正确。不,这是不可能的。位图的大小在创建位图对象时是固定的。代码中的U和V。如果您重新缩放图像使其适合位图,则您对InterpolationMode属性非常感兴趣。NearestNeighbor非常快,它不是很漂亮。您不会使用SetPixel()时,请注意速度.所以你是说,
InterpolationMode
是我为了改变尺寸而应该研究的吗?不,将U和V设置为所需的大小或将其保存为原样,然后创建一个新的图形对象并使用DrawImage和矩形,但这会拉伸图像并可能导致失真。
高度
宽度
由t设置他的代码片段
rec.Height=Height;rec.Width=Width;
,其赋值由屏幕截图中的滑块完成。也就是说,
Height
Width
只会更改画布绘图的高度和宽度。操作不会在
\u heatmap
对象上进行。有没有办法操作e按
saveBMP()时位图对象的尺寸
?据我所知,保存位图时不设置高度和宽度,这些在创建位图对象时是固定的。似乎您的代码应该在U×V像素处生成原始热图,保存它,然后第二个块使用DrawImage将保存的位图加载到另一个图形对象上。这一切听起来都应该正常本质上,U和V的值是什么,第一个保存的图像是什么尺寸,使用什么高度和宽度设置,以及整体输出是什么?我理解这一点,因此图像看起来像这样拉长。每个像素占用相同的高度和宽度,但高度像素多于宽度值。但是,是否有方法更改尺寸?