2011-08-16 8 views
3

.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; 
} 
+0

これはWPFアプリケーション用ですか? –

+0

後でWPFウィンドウを呼び出すのですが、このアイコンを使用する部分はWinFormsです。 WinFormsの部分は、システムトレイにアイコンを表示しています - これは問題を持っているこのアイコンです。ありがとう。 –

+0

GetHicon()は問題ですが、かなり基本的なアルゴリズムを使用しています。これは16原色のみのパレットを使用します。イメージが非常に単純でない限り、結果は常に失望しています。それは難しい問題です、私は完璧な解決策を知りません。 –

答えて

0

私は以下のコードでオーバーレイアイコンとして使用するための透明性を動的にアイコンを作成することができました。私のプログラムでは、いくつの新しいメッセージがキューに入れられたかを示す数字が必要でした。 VBを赦してください。

Private _counter As Integer = 0 

Public Sub NewMessageIncrementOverlay() 
    _counter += 1 
    Dim displayVal = If(_counter > 9, "+", _counter.ToString) 

    Dim bitm As Bitmap = New Bitmap(40, 40, 
         System.Drawing.Imaging.PixelFormat.Format32bppArgb) 
    Dim g As Graphics = Graphics.FromImage(bitm) 
    g.FillRectangle(System.Drawing.Brushes.Transparent, 0, 0, 40, 40) 
    g.FillPie(System.Drawing.Brushes.Red, 0, 0, 40, 40, 0, 360) 
    g.DrawString(displayVal, New Font("Consolas", 30, FontStyle.Bold), 
       System.Drawing.Brushes.White, New PointF(3, -5)) 

    If TaskbarManager.IsPlatformSupported Then 
    Dim icon As Icon = icon.FromHandle(bitm.GetHicon) 
    TaskbarManager.Instance.SetOverlayIcon(icon, displayVal) 
    End If 
End Sub 
関連する問題