Лично я не думаю, что слишком удивительно видеть то, что вы видите.BMP и JPG не поддерживают прозрачность, а PNG поддерживает.
Возьмем этот код, который создает частично прозрачный синий прямоугольник на изображении.
WriteableBitmap bm = new WriteableBitmap( 100, 100, 96, 96, PixelFormats.Pbgra32, null );
bm.Lock();
Bitmap bmp = new Bitmap( bm.PixelWidth, bm.PixelHeight, bm.BackBufferStride, System.Drawing.Imaging.PixelFormat.Format32bppArgb, bm.BackBuffer );
using( Graphics g = Graphics.FromImage( bmp ) ) {
var color = System.Drawing.Color.FromArgb( 20, System.Drawing.Color.Blue);
g.FillRectangle(
new System.Drawing.SolidBrush( color ),
new RectangleF( 0, 0, bmp.Width, bmp.Height ) );
}
bmp.Save( @".\000_foo.bmp", System.Drawing.Imaging.ImageFormat.Bmp );
bmp.Save( @".\000_foo.jpg", System.Drawing.Imaging.ImageFormat.Jpeg );
bmp.Save( @".\000_foo.png", System.Drawing.Imaging.ImageFormat.Png );
bmp.Dispose();
bm.AddDirtyRect( new Int32Rect( 0, 0, bm.PixelWidth, bm.PixelHeight ) );
bm.Unlock();
new BitmapProcessor().SaveAsBmp( bm, @".\foo.bmp" );
new BitmapProcessor().SaveAsJpg( bm, @".\foo.jpg" );
new BitmapProcessor().SaveAsPng( bm, @".\foo.png" );
Форматы PNG всегда работают, будь то System.Drawing или WPF-кодировщики.Кодеры JPG и BMP не работают.Они показывают сплошной синий прямоугольник.
Ключ в том, что я не смог указать цвет фона в моем изображении.Без цвета фона изображение не будет правильно отображаться в форматах, которые не поддерживают альфа-канал (BMP / JPG).С одной дополнительной строкой кода:
g.Clear( System.Drawing.Color.White );
g.FillRectangle(
new System.Drawing.SolidBrush( color ),
new RectangleF( 0, 0, bmp.Width, bmp.Height ) );
Мое изображение имеет цвет фона, поэтому кодировщики, которые не поддерживают альфа-канал, могут определить, какой должен быть выходной цвет на пиксель.Теперь все мои изображения выглядят корректно.
В вашем случае вы должны либо RenderTargetBitmap элемент управления с указанным цветом фона, либо закрасить фоновый цвет при рендеринге вашего изображения.причина, по которой ваш сторонний экран печати работает, заключается в том, что в конечном итоге прозрачные цвета имеют фоновый цвет в этой точке (находясь в окне с фоновым цветом).Но внутри WPF вы имеете дело с элементами, у которых нет одного набора;использование RTB для элемента не наследует его различные свойства родительского элемента, такие как цвет фона.