#c# #winforms #contextmenustrip #.net-4.6.1
#c# #winforms #contextmenustrip #.net-4.6.1
Вопрос:
Я хотел бы иметь лучшее качество изображений ToolStripMenuItem
s, чтобы они не выглядели неровными.
Исходный код 1
private void button2_Click(object sender, EventArgs e)
{
ContextMenuStrip cms = new ContextMenuStrip();
cms.Items.Add("Test", Properties.Resources.path1092);
cms.Show(button2, Cursor.Position);
}
Скриншот
Файл изображения
Исходный код 2
Здесь я использую этот метод:
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(Color.Empty);
using (Graphics gr = Graphics.FromImage(bmp))
{
gr.DrawImage(image, (bmp.Width - newW) / 2,
(bmp.Height - newH) / 2, newW, newH);
}
return bmp;
}
Первый метод выглядит следующим образом:
private void button2_Click(object sender, EventArgs e)
{
ContextMenuStrip cms = new ContextMenuStrip();
ToolStripMenuItem item = new ToolStripMenuItem("Test");
cms.Items.Add(item);
cms.ImageList = new ImageList();
cms.ImageList.ColorDepth = ColorDepth.Depth32Bit;
cms.ImageList.TransparentColor = Color.Empty;
cms.ImageList.ImageSize = new Size(128, 128);
cms.ImageList.Images.Add(ResizeToFitBoundingBox(Properties.Resources.path1092,
new Rectangle(Point.Empty, new Size(128, 128))));
item.ImageTransparentColor = Color.Empty;
item.ImageIndex = 0;
item.ImageTransparentColor = Color.Empty;
cms.Show(button2, Cursor.Position);
}
Скриншот 2
Соотношение сторон сохранено:
Проблема та же.
Комментарии:
1. Вам потребуется высококачественное изменение размера, однако обычно у вас будут готовые изображения нужных вам размеров.
2. Если изображение уже прозрачное, удалите
bmp.MakeTransparent();
. Добавитьgr.SmoothingMode = SmoothingMode.AntiAlias
. Используя ImageList, вам не нужен метод изменения размера. Проблема в том, что высота элемента меню, по-видимому, меньше 128 пикселей. Вы можете получить лучшие результаты, если нарисуете изображение в новом растровом изображении, используя высоту меню в качестве ссылки. Или с соответствующим размером списка изображений.3. Это большой размер, примерно на x6 меньше. Никакое волшебство не заставит это выглядеть хорошо. Похоже, что он использует сглаживание с альфа-смешиванием, вот как вы получаете дыры. Вам нужно вернуться в программу рисования и изменить размер там.