如何使用 DataGridViewImageColumn 缩放显示图像并保持纵横比?
How to use DataGridViewImageColumn to display images using zoom and also keeping the aspect ratio?
我的代码
建立专栏
IconColumn = new DataGridViewImageColumn()
{
Name = "Icon",
HeaderText = "Icon",
SortMode = DataGridViewColumnSortMode.NotSortable,
Width = 50,
ImageLayout = DataGridViewImageCellLayout.Stretch,
Resizable = DataGridViewTriState.False
};
IconColumn.DefaultCellStyle.NullValue = null;
IconColumn.CellTemplate = new ClockDataGridViewIconCell();
设置图标
float maxHeight = 200;
float maxWidth = 200;
var r = new Rectangle(0,
0,
(int)Math.Round(maxWidth),
(int)Math.Round(maxHeight)
);
MyClockData.Icon = Utils.ResizeToFitBoundingBox(
new Bitmap(fd.FileName),
r);
ResizeToFitBoundingBox
方法
internal static Bitmap ResizeToFitBoundingBox(Image image, in Rectangle box)
{
float maxHeight = box.Width;
float maxWidth = box.Height;
float x = Math.Min(maxWidth / image.Width,
maxHeight / image.Height);
float newW = (float)image.Width * x;
float newH = (float)image.Height * x;
var bmp = new Bitmap((int)Math.Round(maxWidth),
(int)Math.Round(maxHeight));
bmp.MakeTransparent();
using (Graphics gr = Graphics.FromImage(bmp))
{
gr.DrawImage(image, (bmp.Width - newW) / 2,
(bmp.Height - newH) / 2, newW, newH);
}
return bmp;
}
示例图标
我已经尝试了 DataGridViewImageColumn.ImageLayout
的所有 4 个可能值,单元格看起来一样:
- 正常
- 未设置
- 拉伸
- 缩放
None 可以满足我的要求。官方文档是here. I would like the same behaviour as Forms.ImageLayout.Zoom.
注意:我使用.NET Framework v4.6.1。
我通过添加这一行解决了这个问题:
IconColumn.ImageLayout = DataGridViewImageCellLayout.Zoom;
在每个添加或更新 DataGridView 中的图标的语句之后。
似乎将此 属性 设置为与以前相同的值会按照 属性 的值建议的方式重新绘制列中的图标。
我的代码
建立专栏
IconColumn = new DataGridViewImageColumn()
{
Name = "Icon",
HeaderText = "Icon",
SortMode = DataGridViewColumnSortMode.NotSortable,
Width = 50,
ImageLayout = DataGridViewImageCellLayout.Stretch,
Resizable = DataGridViewTriState.False
};
IconColumn.DefaultCellStyle.NullValue = null;
IconColumn.CellTemplate = new ClockDataGridViewIconCell();
设置图标
float maxHeight = 200;
float maxWidth = 200;
var r = new Rectangle(0,
0,
(int)Math.Round(maxWidth),
(int)Math.Round(maxHeight)
);
MyClockData.Icon = Utils.ResizeToFitBoundingBox(
new Bitmap(fd.FileName),
r);
ResizeToFitBoundingBox
方法
internal static Bitmap ResizeToFitBoundingBox(Image image, in Rectangle box)
{
float maxHeight = box.Width;
float maxWidth = box.Height;
float x = Math.Min(maxWidth / image.Width,
maxHeight / image.Height);
float newW = (float)image.Width * x;
float newH = (float)image.Height * x;
var bmp = new Bitmap((int)Math.Round(maxWidth),
(int)Math.Round(maxHeight));
bmp.MakeTransparent();
using (Graphics gr = Graphics.FromImage(bmp))
{
gr.DrawImage(image, (bmp.Width - newW) / 2,
(bmp.Height - newH) / 2, newW, newH);
}
return bmp;
}
示例图标
我已经尝试了 DataGridViewImageColumn.ImageLayout
的所有 4 个可能值,单元格看起来一样:
- 正常
- 未设置
- 拉伸
- 缩放
None 可以满足我的要求。官方文档是here. I would like the same behaviour as Forms.ImageLayout.Zoom.
注意:我使用.NET Framework v4.6.1。
我通过添加这一行解决了这个问题:
IconColumn.ImageLayout = DataGridViewImageCellLayout.Zoom;
在每个添加或更新 DataGridView 中的图标的语句之后。
似乎将此 属性 设置为与以前相同的值会按照 属性 的值建议的方式重新绘制列中的图标。