System.Drawing и WPF Interop - CreateBitmapSourceFromHBitmap - PullRequest
1 голос
/ 28 февраля 2011

У меня проблема взаимодействия между system.drawing и WPF. Чтобы упростить этот вопрос, я построил пример для иллюстрации проблемы. Я рисую, используя System.Drawing, а затем копирую результат в System.Windows.Controls.Image, используя CreateBitmapSourceFromHBitmap. И почему-то альфа-информация теряется, как вы можете видеть на скриншоте.

Черный текст рисуется на прозрачном растровом изображении и затем копируется в компонент изображения, который сам является прозрачным. Сама родительская сетка имеет черный фон. Я предполагаю, что в результате получается полностью черное изображение, но это не так, текст, кажется, рисуется с использованием белого в качестве фона при выполнении сглаживания.

Ссылка на скриншот

Вот код для MainWindow.xaml:

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="350" Width="525">
    <Grid Name="grid" Background="Black">
        <Image Name="image" Stretch="Fill" Loaded="image_Loaded"></Image>
    </Grid>
</Window>

И код для MainWindow.xaml.cs:

using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Text;
using System.Windows;

namespace WpfApplication1
{
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
        }

        private void image_Loaded(object sender, RoutedEventArgs e)
        {
            //use system drawing to draw text
            Bitmap bmp = new Bitmap ( (Int32) grid.ActualWidth, (Int32) grid.ActualHeight );
            Graphics graphics = Graphics.FromImage ( bmp );

            var brush = new SolidBrush(Color.FromArgb(255, 0, 0, 0));
            var font = new Font(System.Drawing.FontFamily.GenericSansSerif, 30.0f, System.Drawing.FontStyle.Regular, GraphicsUnit.Pixel);

            graphics.Clear(Color.Transparent);
            graphics.SmoothingMode = SmoothingMode.HighQuality;
            graphics.CompositingMode = CompositingMode.SourceOver;
            graphics.CompositingQuality = CompositingQuality.HighQuality;

            //draw text
            graphics.TextRenderingHint = TextRenderingHint.AntiAliasGridFit;
            graphics.TextContrast = 5;
            graphics.DrawString("My Text", font, brush, 10, 10);

            //try saving
            bmp.Save("E:\\temp.png", System.Drawing.Imaging.ImageFormat.Png);

            //back to wpf image control
            image.Source = System.Windows.Interop.Imaging.CreateBitmapSourceFromHBitmap ( bmp.GetHbitmap ( ), IntPtr.Zero, Int32Rect.Empty, System.Windows.Media.Imaging.BitmapSizeOptions.FromWidthAndHeight ( (Int32) grid.ActualWidth, (Int32) grid.ActualHeight ) );
        }
    }
}

Кто-нибудь испытывал это? Как получить эффект сглаживания, который предварительно не умножается на белый?

1 Ответ

0 голосов
/ 02 мая 2011

Не самое привлекательное решение, но единственный способ заставить его работать должным образом, это сохранить растровое изображение с помощью функции Save (), а затем декодировать его и загрузить как BitmapSource:

     bmp.Save("E:\\temp.png", System.Drawing.Imaging.ImageFormat.Png);
     //A neater way to free up the file!
     bmp.Dispose();
     bmp = null;
     //Load up the image.
     BitmapFrame frm = new BitmapFrame(new Uri("E:\\temp.png"));
     image.Source = frm as BitmapSource;

Теперь это не самое удачное решение, но это все, с чем я могу столкнуться.

...