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的值是什么,第一个保存的图像是什么尺寸,使用什么高度和宽度设置,以及整体输出是什么?我理解这一点,因此图像看起来像这样拉长。每个像素占用相同的高度和宽度,但高度像素多于宽度值。但是,是否有方法更改尺寸?