Проблемы с прозрачностью при добавлении оверлея к значку - PullRequest
3 голосов
/ 16 августа 2011

У меня есть файл .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;
}

1 Ответ

0 голосов
/ 09 февраля 2012

Мне удалось создать иконку динамически с прозрачностью для использования в качестве значка наложения с кодом ниже. Для моей программы я хотел, чтобы число отображало, сколько новых сообщений было поставлено в очередь. Простите за ВБ ...

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
...