У меня есть файл .ico
с файлом .png
, у которого есть наложение, которое я хочу применить к значку. Я очень неопытен в этом, поэтому сумел убрать кусочки кода из интернета, пока у меня не было чего-то, что почти работает.
Проблема в том, что прозрачность теряется и заменяется белым.
Кроме того, я думаю, что диапазон цветов уменьшен. Я добавил отладочный код (закомментированный), чтобы сохранить значок в 2 этапа. Когда я редактирую его на первом этапе в VS 2010, цветовая палитра имеет 16 цветов, а stage1.ico - гораздо больше.
Кажется, что Icon.FromHandle
вызывает проблемы. Функция ниже принимает два параметра ImageSource. Первый происходит из файла .ico
, а второй из файла .png
(наложение).
Что мне делать вместо этого?
Функция -
private static Icon Render(ImageSource baseImage, ImageSource overlay)
{
int iconSize = 32;
RenderTargetBitmap renderBitmap
= new RenderTargetBitmap(iconSize,
iconSize,
96, 96,
PixelFormats.Pbgra32);
DrawingVisual visual = new DrawingVisual();
using (DrawingContext context = visual.RenderOpen())
{
context.DrawImage(baseImage, new System.Windows.Rect(0, 0, iconSize, iconSize));
context.DrawImage(overlay, new System.Windows.Rect(0, 0, iconSize, iconSize));
context.Close();
renderBitmap.Render(visual);
}
BmpBitmapEncoder encoder = new BmpBitmapEncoder();
encoder.Frames.Add(BitmapFrame.Create(renderBitmap));
MemoryStream stream = new MemoryStream();
encoder.Save(stream);
Bitmap bmp = new Bitmap(stream);
//bmp.Save("c:\\tmp\\stage1.ico"); // save what we have here
IntPtr Hicon = bmp.GetHicon();
Icon icon = Icon.FromHandle(Hicon);
// Looking at stage2.ico gives a different version to stage1.ico
//using (var fs = new FileStream("c:\\tmp\\stage2.ico", FileMode.Create, FileAccess.Write, FileShare.Delete))
//{
//icon.Save(fs);
//}
return icon;
}