Как создать изображение с высоким разрешением из FrameworkElement?

У меня есть FrameworkElement, и я хочу сохранить его как изображение с высоким разрешением (Jpeg). Я попробовал следующий код, но результаты оказались не такими, как я надеялся. Я получил изображение с плохим разрешением, когда распечатал его с размером бумаги A4.

        // ...
        FrameworkElement element = this.Content;           
        element.Measure(new System.Windows.Size(double.PositiveInfinity, double.PositiveInfinity));
        element.Arrange(new Rect(element.DesiredSize));
        element.UpdateLayout();

        // i used element.ActulaHeight and ActualWidth but not works.
        RenderTargetBitmap bitmap = new RenderTargetBitmap((int)element.Width, (int)element.Height, GPFReporstPageSizeExtension.DPI, GPFReporstPageSizeExtension.DPI, System.Windows.Media.PixelFormats.Pbgra32);
        bitmap.Render(element);
        // ....

person Henka Programmer    schedule 24.02.2015    source источник
comment
Вы имеете в виду высокое разрешение? Я не уверен, что означает термин «высотное разрешение». В более общем смысле: для вашего растрового изображения вам нужно будет указать размер пикселя желаемого разрешения. Обратите внимание, что 300 dpi (примерно самое низкое разрешение, которое большинство людей считают высоким) на бумаге формата A4 составляет примерно 2500 пикселей в ширину и 3500 пикселей в высоту; если вы используете значения ширины и высоты из своих экранных координат, вы определенно получите изображение с низким разрешением на листе A4. Без хорошего, минимального, полного примера кода невозможно дать хороший ответ.   -  person Peter Duniho    schedule 25.02.2015
comment
Попробуйте ScaleTransform элемент управления и визуализировать этот элемент управления...   -  person Rico Suter    schedule 25.02.2015
comment
Не распечатывайте это. Сначала проверьте изображение. Это то, что вы ожидаете?   -  person usr    schedule 25.02.2015


Ответы (1)


Наконец я решил свою проблему, я разместил полное решение в своем блоге "веб-сайт gamadev: Сохранение элемента FrameworkElement как изображения

    FrameworkElement element = myControl.Content;
// you can set the size as you need.
Size theTargetSize = new Size(1500,2000)
element.Measure(new System.Windows.Size(double.PositiveInfinity, double.PositiveInfinity));
element.Arrange(new Rect(theTargetSize ));
// to affect the changes in the UI, you must call this method at the end to apply the new changes
element.UpdateLayout();

double dpiScale = 300.0 / 96;

double dpiX = 300.0;
double dpiY = 300.0;
RenderTargetBitmap bmp = new RenderTargetBitmap(Convert.ToInt32(
(theTargetSize .Width) * dpiScale),
Convert.ToInt32((theTargetSize .Height) * dpiScale),
dpiX, dpiY, PixelFormats.Pbgra32);

bmp.Render(element);

element.Measure(new System.Windows.Size());
element.Arrange(new Rect());
element.UpdateLayout();

System.Windows.Media.Imaging.BitmapEncoder encoder = new System.Windows.Media.Imaging.PngBitmapEncoder();
MemoryStream myStream = new MemoryStream();
encoder.Frames.Add(System.Windows.Media.Imaging.BitmapFrame.Create(this.CreateRenderTargetBitmap()));
encoder.Save(myStream);
var img = System.Drawing.Bitmap.FromStream(myStream);

Bitmap bmp = new Bitmap((int)theTargetSize .Width, (int)theTargetSize .Height);

var g = Graphics.FromImage(bmp);
g.Clear(System.Drawing.Color.White);

g.DrawImage(this.GetPageAsImage(), (int)this.Margin.Left, (int)this.Margin.Top);
fileName = @”D:\myImage.png”;
bmp.Save(fileName);
person Henka Programmer    schedule 03.03.2015
comment
Этот бит необъясним: this.CreateRenderTargetBitmap() - person Mal Ross; 16.09.2016
comment
Вместо encoder.Frames.Add(BitmapFrame.Create(this.CreateRenderTargetBitmap())); звоните encoder.Frames.Add(BitmapFrame.Create(bmp)) - person Jörgen Sigvardsson; 18.10.2016