Я хотел бы создать единую систему. Рисование. Значок программно от 32x32, 16x16 Битовые массивы. Действительно ли это возможно? Если я загружаю значок -
Icon myIcon = new Icon(@"C:\myIcon.ico");
... это может содержать повторные изображения.
Файл .ico может иметь несколько изображений в нем, но при загрузке файла .ico и создайте объект значка, загружен только один из этих изображений. Windows выбирает наиболее подходящее изображение на основе текущего режима отображения и системных настроек и использует этот для инициализации объекта System.drawing.icon
, игнорируя другие.
Итак, вы не можете создать System.drawing.icon
с несколькими изображениями, вы должны выбрать один, прежде чем создать объект
.
Конечно, можно создать значок во время выполнения от растрового изображения, это то, что вы действительно спрашиваете? Или вы спрашиваете, как создать файл .ico?
Вы можете попробовать использовать PNG2ICO для создания файла .ico, вызывая его использование System.diagnostics.process.Start
. Вам нужно будет создавать ваши изображения и сохранить их на диск перед вызовом PNG2ICO.
Там здесь хороший фрагмент кода . Он использует метод Icon.fromhandle
.
Из ссылки:
/// <summary>
/// Converts an image into an icon.
/// </summary>
/// <param name="img">The image that shall become an icon</param>
/// <param name="size">The width and height of the icon. Standard
/// sizes are 16x16, 32x32, 48x48, 64x64.</param>
/// <param name="keepAspectRatio">Whether the image should be squashed into a
/// square or whether whitespace should be put around it.</param>
/// <returns>An icon!!</returns>
private Icon MakeIcon(Image img, int size, bool keepAspectRatio) {
Bitmap square = new Bitmap(size, size); // create new bitmap
Graphics g = Graphics.FromImage(square); // allow drawing to it
int x, y, w, h; // dimensions for new image
if(!keepAspectRatio || img.Height == img.Width) {
// just fill the square
x = y = 0; // set x and y to 0
w = h = size; // set width and height to size
} else {
// work out the aspect ratio
float r = (float)img.Width / (float)img.Height;
// set dimensions accordingly to fit inside size^2 square
if(r > 1) { // w is bigger, so divide h by r
w = size;
h = (int)((float)size / r);
x = 0; y = (size - h) / 2; // center the image
} else { // h is bigger, so multiply w by r
w = (int)((float)size * r);
h = size;
y = 0; x = (size - w) / 2; // center the image
}
}
// make the image shrink nicely by using HighQualityBicubic mode
g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic;
g.DrawImage(img, x, y, w, h); // draw image with specified dimensions
g.Flush(); // make sure all drawing operations complete before we get the icon
// following line would work directly on any image, but then
// it wouldn't look as nice.
return Icon.FromHandle(square.GetHicon());
}