gpt4 book ai didi

.net - 如何使工具栏图标根据 dpi 缩放而不模糊?

转载 作者:行者123 更新时间:2023-12-04 13:05:05 24 4
gpt4 key购买 nike

我的 WinForms 应用程序有一个工具栏。工具栏按钮类型为 ToolStripButton .图标图像是 16x16 png,作为资源安装。

this.BtnNew.Image = Resources.NewDocument;
this.BtnNew.ImageScaling = ToolStripItemImageScaling.None;

这在大多数计算机上看起来不错,但是在具有高 dpi 的计算机上,工具栏按钮与应用程序的其余部分相比显得很小(文本被放大)。我也希望工具栏图标可以缩放。

我试过
this.BtnNew.ImageScaling = ToolStripItemImageScaling.SizeToFit;

这正确缩放了图标,但它看起来很模糊,这当然是因为原始图像只有 16x16 像素。

如何让图标根据 dpi 正确缩放而不会模糊?使用 64x64 png 会更好吗,或者当它们按比例缩小时我会得到不同类型的模糊吗?我可以使用 svg 图像吗?

最佳答案

缩小看起来比放大更好。通常对于图标图像,将创建预定义的大小。为简单起见,假设宽度和高度相等。所以图像大小为 { 16, 24, 32, 48, 64, 128, 256 }。使用单个 64x64 需要测试以查看结果是否可以接受。
ToolStripButton的高度将由其 Font 决定如果按钮显示一些文本。如果没有文字,那么仍然可以根据Font计算出首选高度。 ,或通过 Graphics.Dpi特性。显示的图像可以动态缩放以适合 ToolStripItem 的首选高度。 .例如。

public class MyToolStripButton : ToolStripButton {

public IList<Image> Images { get; private set; }

public MyToolStripButton(String text, IList<Image> images) : base(text) {
Images = images.OrderBy(i => i.Height).ToList();
ImageScaling = ToolStripItemImageScaling.None;
RefreshImage();
}

protected override void OnFontChanged(EventArgs e) {
base.OnFontChanged(e);
RefreshImage();
}

public void RefreshImage() {
int h = this.Height;
Image bestImage = null;
for (int i = 0; i < Images.Count; i++) {
var img = Images[i];
if (img.Height > h || i == Images.Count - 1) {
bestImage = img;
break;
}
}

// scale down the image
Image oldImage = this.Image;
Bitmap newImage = new Bitmap(h, h);
using (var g = Graphics.FromImage(newImage)) {
g.DrawImage(bestImage, 0, 0, h, h);
}

this.Image = newImage;

if (oldImage != null)
oldImage.Dispose();
}
}

[STAThread]
static void Main() {
Form f = new Form();
MenuStrip menu1 = new MenuStrip() { Dock = DockStyle.Top };
f.Controls.Add(menu1);
f.MainMenuStrip = menu1;

int[] res = { 16, 32, 48, 64, 128 };
Image[] images = new Image[res.Length];
for (int i = 0; i < res.Length; i++) {
Bitmap img = new Bitmap(res[i], res[i]);
using (var g = Graphics.FromImage(img)) {
g.DrawEllipse(Pens.Red, 0, 0, res[i], res[i]);
}
images[i] = img;
}

MyToolStripButton btn1 = new MyToolStripButton("Button", images);
btn1.Click += delegate {
Font fnt = btn1.Owner.Font;
btn1.Owner.Font = new Font(fnt.FontFamily, fnt.Size + 2f, fnt.Style);
};
menu1.Items.Add(btn1);
Application.Run(f);
}

关于.net - 如何使工具栏图标根据 dpi 缩放而不模糊?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31158204/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com