Как преобразовать объект Graphics в объект Bitmap внутри события PrintPage? - PullRequest
1 голос
/ 16 сентября 2009

Это проблема высокого уровня, которую я пытаюсь решить ...

У меня есть стороннее построение графиков (IoComp Plot), и я хочу встроить высококачественное (не менее 600 dpi) растровое изображение элемента управления Plot в отчеты, созданные другим пакетом отчетов сторонних производителей (Combit List & Label).

Этот подход кажется наиболее перспективным до сих пор ...

--- Редактировать ---:

Попробовав множество других подходов, я думаю, что единственное, что я могу сделать, - это создать скрытый экземпляр элемента управления Plot со всем масштабированием до размера принтера (примерно в 5 раз больше размера экрана). Это включает в себя ширину и высоту, размеры шрифта, ширину линии - каждый видимый компонент элемента управления. Тьфу!

------

Я могу получить объект Graphics с надлежащим разрешением из события PrintPage элемента управления сюжетом, но преобразование его в растровое изображение, чтобы пакет отчета был счастливым, оказалось главным камнем преткновения. Несколько часов поисков привели к тому, что другие люди задавали тот же вопрос, но не дали жизнеспособных ответов.

Единственное многообещающее руководство, которое я нашел, предложило использовать один из конструкторов Bitmap, который принимает экземпляр Graphics в качестве параметра.

Однако, это не работает для меня. Он создает растровое изображение, но без содержимого из элемента управления «График» - это чисто черное изображение.

Вот мой код (отредактированный для отображения рисования красной линии на объекте Graphics):

void PrintDocument_PrintPage(object sender, PrintPageEventArgs e)
{
        // Draw a red line on the Graphics object. When printed, this
        // line is shown as part of the normal Plot graphics.
        Pen myPen;
        myPen = new Pen(Color.Red);
        e.Graphics.DrawLine(myPen, 0, 0, 200, 200);
        myPen.Dispose();

        // Create a bitmap from the Graphics object
        Bitmap bm = new Bitmap(1000, 1000, e.Graphics);

        // Save to disk 
        // DOES NOT WORK - CREATES FILE THAT IS PURE BLACK (VIEWED
        // WITH "PAINT" PROGRAM)
        bm.Save(@"C:\Bicw_Dev\Bic.Net\FrontEnd\GraphicsToBmp.bmp", ImageFormat.Bmp);
        bm.Dispose();
}

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

Также обратите внимание:

Насколько я могу определить (а я потратил немало времени на поиск) нет способа получить высокое разрешение и качество печати Bitmap непосредственно из элемента управления Plot !

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

Мне нужно преобразовать объект Graphics в объект Bitmap .

И если кто-нибудь может предложить альтернативный подход, который позволит мне включить в свои отчеты качество печати изображений моих графиков, пожалуйста, не стесняйтесь. (Например, я могу получить растровое изображение низкого качества (72 бит / дюйм) из элемента управления Plot, и я пытался его растянуть, но я никогда не видел, чтобы этот подход работал хорошо в других приложениях). 1052 *

Спасибо

-Tom Bushell

Редактировать в ответ на комментарий:

В качестве эксперимента я добавил следующее:

Pen myPen; 
myPen = new Pen(Color.Red); 
e.Graphics.DrawLine(myPen, 0, 0, 200, 200); 
myPen.Dispose(); 

Это привело к рисованию красной линии над графикой графика, когда я печатал свой график. Но это никак не повлияло на растровое изображение - оно все еще чисто черное.

Ответы [ 3 ]

1 голос
/ 16 сентября 2009

Используемый вами конструктор не копирует графику, а только устанавливает разрешение, равное разрешению графики. См. msdn . Как указывает Леппи, вы должны что-то нарисовать на растровом изображении. Я предлагаю получить еще один графический объект для только что созданного вами элемента.

Graphics g = Graphics.FromImage(bmp);
//Make the background white
g.FillRectangle(Brushes.White, 0, 0, 1000, 1000);
1 голос
/ 16 сентября 2009

Нелегко управлять DPI в системе Print (Preview).

Но, может быть, вы делаете это неправильно. Вам нужно создать (большое) растровое изображение, а затем «обмануть» элемент управления для использования этого растрового изображения, как если бы это был экран. См этот список ссылок .
Нет необходимости в PrintDocument.

1 голос
/ 16 сентября 2009

Однако, это не работает для меня. Это создает растровое изображение, но без содержимого из контрольного участка - это чистый черное изображение.

Ну, ты никогда не рисуешь графику, чего ты ждешь?

Предполагается, что вы фактически делаете чертеж для вывода в этом событии.

...