.png
ファイルのファイルに.ico
があり、アイコンに適用したいオーバーレイがあります。私はこれで非常に経験が不十分なので、ほとんどのコードがインターネットから取り出され、ほとんど動作するようになりました。アイコンにオーバーレイを追加するときの透明度の問題
問題は、透明度が失われ、白に置き換えられることです。
また、色の範囲が狭くなると思います。私は2つの段階でアイコンを保存するためにいくつかのデバッグコード(コメントアウト)を追加しました。 VS 2010の最初の段階で編集すると、カラーパレットには16色、stage1.icoにはさらに多くの色があります。
問題を引き起こしていると思われます。以下の関数は2つのImageSourceパラメータを取ります。最初は.ico
ファイルから、2番目は.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;
}
これはWPFアプリケーション用ですか? –
後でWPFウィンドウを呼び出すのですが、このアイコンを使用する部分はWinFormsです。 WinFormsの部分は、システムトレイにアイコンを表示しています - これは問題を持っているこのアイコンです。ありがとう。 –
GetHicon()は問題ですが、かなり基本的なアルゴリズムを使用しています。これは16原色のみのパレットを使用します。イメージが非常に単純でない限り、結果は常に失望しています。それは難しい問題です、私は完璧な解決策を知りません。 –