Печать timage


8.3. Вывод на печать.

Процедура вывода изображений на печать в Qt очень похожа на рисование по поверхности виджетов. Вкратце, процесс печати можно представить следующими шагами:

Создается экземпляр класса QPrinter, который будет представлять «устройство для рисования».

Вызывается функция QPrinter::setup(), которая покажет пользователю диалог выбора принтера.

Создается экземпляр класса QPainter, который будет взаимодействовать с объектом QPrinter.

Средствами QPainter рисуется изображение на странице.

Вызывается метод QPrinter::newPage(), чтобы прокрутить страницу.

Повторять действия, описанные в пунктах 4 и 5, пока не будут отпечатаны все страницы.

В операционных системах Windows и Mac OS X, QPrinter использует системные драйверы. В Unix страницы генерируются в формате PostScript и затем передаются устройству печати lp или lpr (или любой другой программе, которая будет назначена вызовом QPrinter::setPrintProgram()).

Рисунок 8.15. Пример вывода на печать виджетов OvenTimer, QCanvas и QImage.

Начнем обсуждение с простого примера, который печатает одну страницу. Для начала напечатаем виджет OvenTimer: Здесь мы исходим из того, что класс PrintWindow содержит переменную-член printer, класса QPrinter. В противном случае можно было бы создать экземпляр QPrinter на стеке, но в этом случае у нас отсутствовала бы возможность сохранить пользовательские настройки принтера.

Мы вызываем setup(), чтобы запустить диалог выбора принтера. Она возвращает true, если пользователь нажал на кнопку OK. После вызова setup(), объект QPrinter готов к работе.

Далее создается QPainter, который будет рисовать на QPrinter. Потом настраивается область просмотра (viewport) и назначается система координат окна (-50, -50, 100, 100) — прямоугольник, который ожидает получить OvenTimer, и в завершение выполняется рисование виджета, вызовом функции draw(). Если не установить размеры области просмотра, то виджет OvenTimer будет вытянут на всю высоту страницы.

По-умолчанию QPainter устанавливает размеры окна такими, чтобы они соответствовали разрешению экрана (обычно где-то между 72 и 100 точками на дюйм), но в данном случае это не имеет большого значения, так как мы сами установили систему координат окна.

Пример вывода на печать виджета OvenTimer не имеет особой практической ценности, потому что он предназначен, в первую очередь, для вывода на экран и взаимодействия с пользователем. Но для других виджетов, таких как Plotter, который был разработан нами в Главе 5, этот пример приобретает определенный смысл.

Более практичный пример — вывод на печать QCanvas. Приложения, которые его используют, очень часто нуждаются в возможности вывода на печать того, что нарисует пользователь.

На этот раз мы установили систему координат окна в соответствии с размерами канвы и ограничили область просмотра тем же самым соотношением сторон. Для этого мы использовали функцию QSize::scale(), задав в качестве второго аргумента ScaleMin. Например, если канва имела размер 640 X 480, а область просмотра QPainter — 5000 X 5000, в результате получится область просмотра с размерами 5000 X 3750.

Функция collisions() возвратит список видимых элементов канвы, отсортированный по значению координаты z. Список просматривается в цикле, начиная с конца, и выполняется рисование элементов списка вызовом QCanvasItem::draw(). Таким образом, чем выше в списке стоит элемент, тем позднее он будет нарисован.

Третий пример — печать картинки из QImage.

Мы установили размеры окна в соответствии с размерами изображения и размеры области просмотра (viewport), чтобы соблюсти отношения сторон, после чего нарисовали изображение, начиная с позиции (0, 0).

Печать компонентов, которые занимают не более одной страницы, достаточно проста. Но нередко приходится сталкиваться с необходимостью вывода на печать многостраничных документов. В таких случаях нужно вывести на печать одну страницу, затем вызвать функцию newPage() и напечатать следующую страницу. Однако здесь возникает проблема определения окончания каждой из страниц.

Qt предлагает два варианта вывода на печать многостраничных документов:

Можно «перегнать» документ в формат HTML и вывести его средствами QSimpleRichText.

Можно выполнять перевод страниц вручную.

Далее мы рассмотрим оба варианта.

В качестве примера напечатаем справочник цветовода, который содержит названия цветов и их краткое описание. Каждая статья справочника хранится в виде «название: описание» , например:

Поскольку каждая статья представлена одной строкой, то весь справочник можно представить как список строк — QStringList.

Следующий фрагмент кода выводит на печать содержимое справочника, предварительно «перегнав» его в формат HTML:

Рисунок 8.16. Пример вывода на печать справочника цветовода, с помощью QSimpleRichText.

Рисунок 8.17. Раскладка страницы справочника цветовода.

После этого выполняется печать каждой страницы. Внешний цикл for отсчитывает количество копий, запрошенных пользователем. В большинстве своем, драйверы принтеров поддерживают печать нескольких копий документа, в этом случае функция QPrinter::numCopies() вернет 1, в противном случае — количество копий, запрошенных пользователем. В предыдущих примерах, с целью упрощения кода, мы игнорировали этот параметр.

Внутренний цикл for отсчитывет страницы. если страница не является первой, то вызывается функция newPage(). Для вывода очередной страницы на печать вызывается функция printPage().

Диалог выбора принтера позволяет пользователю заказать печать страниц в обратном порядке, мы так же соблюдаем и это требование.


В данном примере предполагается, что printer, bodyFont и footerFont — это переменные-члены класса PrintWindow.

Функция printPage() выводит на печать (index + 1)-ую страницу. Она содержит HTML-код и номер страницы в нижнем колонтитуле.

Мы выполняем смещение системы координат и вызываем draw(), чтобы нарисовать текст, с нужной позиции. После этого, в нижнем колонтитуле, по центру страницы, выводится ее номер. Если бы нам потребовалось выводить что нибудь в верхнем колонтитуле, то мы добавили бы еще один вызов drawText().

Константа LargeGap равна числу 48. Если исходить из предположения, что разрешение экрана срставляет 96 точек на дюйм, то число 48 соответствует половине дюйма (12.7 мм). Чтобы найти точное значение для константы, в каждом конкретном случае, можно воспользоваться услугами класса QPaintDeviceMetrics:

Илон Маск рекомендует:  Что такое код ini_get_all

Ниже приводится один из вариантов инициализации bodyFont и footerFont в конструкторе PrintWindow: А теперь покажем, как напечатать справочник с помощью QPainter. Ниже приводится измененный вариант функции printFlowerGu >QPainter — это вызвать вспомогательную функцию paginate(), чтобы определить разбивку справочника по страницам. Результат работы функции — массив QStringList, в котором каждый из элементов хранит статьи справочника для одной страницы.

Например, допустим, что справочник содержит всего 6 статей, которые мы обозначим как A, B, C, D, E и F. Теперь предположим, что статьи A и B располагаются на первой странице, C, D и E — на второй, а F — на третьей. Таким образом, массив pages, в элементе с индексом 0, будет содержать статьи A и B, статьи C, D и E — в элементе с индексом 1 и статью F — в элементе с индексом 2.

В остальном, функция printFlowerGu >printPage() имеет существенные отличия, но об этом немного позже.

Функция paginate() распределяет статьи справочника по страницам, основываясь на результатах функции entryHeight(), которая вычисляет высоту одной статьи.

Рисунок 8.18. Вывод справочника цветовода с помощью QPainter.

Рисунок 8.19. Раскладка одной статьи справочника.

Функция entryHeight(), с помощью QPainter::boundingRect(), вычисляет высоту статьи на странице. На рисунке 8.19 показана раскладка статьи справочника и назначение констант SmallGap и MediumGap. Функция printPage() обходит в цикле все статьи справочника и печатает их в два приема: первый раз функция printBox() вызывается для печати заголовка статьи (название цветка) и второй раз — для печати описания (тела статьи). В заключение печатается номер страницы, внизу по центру. Функция printBox() рисует прямоугольник, а затем внутри него — текст.

Если на печать выводится большой документ, или пользователь заказал несколько копий одного документа, то неплохо было бы показать индикатор хода выполнения задания — QProgressDialog. Ниже приводится модифицированный вариант функции printFlowerGuide(), которая выводит перед пользователем индикатор хода выполнения задания:

Когда пользователь нажимает на кнопку Cancel — вызывается QPrinter::abort(), которая останавливает процесс печати.

Qt печать

06.02.2020, 16:58

Печать для группы пользователей \ печать с авторизацией
Всем привет, Стоит задача организовать возможность печати для группы пользователей на одном.

Кнопка Печать на форме Печать документов
в 1С v8.2 Управление производственным предприятием на форму «Печать документов» добавил кнопку.

Кнопка печать на форме Печать документов
в 1С v8.2 Управление производственным предприятием на форму «Печать документов» добавил кнопку.

Какое взять МФУ для дома? Нужна 2х сторонняя печать, вай-фай, печать без полей, чтобы качество фоток тоже было
Всем доброго дня! Помогите советом: нужно хорошее струйное МФУ для дома. Нужна 2х сторонняя.

06.02.2020, 18:45 2 06.02.2020, 18:52 3 07.02.2020, 02:50 [ТС] 4

Насколько я понял проблема в функции textBrowser->print() ,которая выставляет отступы по умолчанию. Возможно попробую рисовать вручную. Удобно то что страница всего одна.

Добавлено через 3 часа 31 минуту
Пока делаю так

Но кусок с правой стороны не помещается. Как-то надо сделать по ширине страницы, не нашел как.

Добавлено через 3 часа 15 минут
Пока что имею такой код.

Listed below is a piece of code contained in NewsLetter by the Borland Support
Group. Tried it with C++Builder5 and bombed at this line:

pal = static_cast(malloc (sizeof (LOGPALETTE) + (sizeof (PALETTEENTRY) * 256)));

because it is contrary to definition of static_cast as:

There two possibilities why this occured:

1. I am doing something wrong possibly in the compiler/linker options and/or
an INCLUDE is missing.

2. Borland Support made a code that will not even compile. Highly improbable. I was with technical support in the early 90’s with Nantucket then Computer Associates and this is definitely a NO NO. Again highly improbable.

P.S. I mentioned company names and if this contrary to your rules and/or inappropriatevplease feel to delete these names.

Printing a TImage — by Borland Developer Support Staff
Abstract: This document describes how to print a TImage that contains a Bitmap at a size that you scale to

The simple way to print a TImage is to use the print method of a TForm that contains only the bitmap. This works,
except that on many machines this will print out too small, or will fail to print. The following code will print
the TImage at a size that is scaled to fit the whole page. You could change the scaling and have it print to
whatever size you want.

Note: The image must contain a Bitmap. This particular function will only work if it is a Bitmap,
icons and cursors will not work.


/*———————— ———- ———- ———- ———- ——-
This function is the OnClick event of a TButton that is on a TForm.
On the TForm is also a TImage named image.
————————— ———- ———- ———- ———- ——*/
void __fastcall Tmain_form::print_image_bt nClick(TOb ject *Sender)
<
TPrinter *p = Printer();

// create a memory dc for the image
HDC h_dc = image->Picture->Bitmap->Ca nvas->Hand le;
int bmp_w = image->Picture->Bitmap->Wi dth,
bmp_h = image->Picture->Bitmap->He ight;
HDC h_mem_dc = ::CreateCompatibleDC (h_dc);
HBITMAP h_mem_bmp = ::CreateCompatibleBitmap (h_dc, bmp_w, bmp_h);
HBITMAP h_old_bmp = ::SelectObject (h_mem_dc, h_mem_bmp);

// fix up bad video drivers
bool is_pal_dev = false;
LOGPALETTE *pal;
HPALETTE h_pal, h_old_pal;

if (::GetDeviceCaps (image->Canvas->Handle, RASTERCAPS) & RC_PALETTE)
<
pal = static_cast(malloc (sizeof (LOGPALETTE) + (sizeof (PALETTEENTRY) * 256)));
memset (pal, 0, sizeof (LOGPALETTE) + (sizeof (PALETTEENTRY) * 256));
pal->palVersion = 0x300;
pal->palNumEntries = ::GetSystemPaletteEntries( image->Can vas->Handl e, 0, 256, pal->palPalEntry);
if (pal->palNumEntries != 0)
<
h_pal = ::CreatePalette (pal);
h_old_pal = ::SelectPalette (h_mem_dc, h_pal, false);
is_pal_dev = true;
>
else
<
free (pal);
>
>

// copy the image on to the memory dc
::BitBlt (h_mem_dc, 0, 0, bmp_w, bmp_h, h_dc, 0, 0, SRCCOPY);

if (is_pal_dev)
<
::SelectPalette (h_mem_dc, h_old_pal, false);
::DeleteObject (h_pal);
>

// delete the mem dc
::SelectObject (h_mem_dc, h_old_bmp);
::DeleteDC (h_mem_dc);

// get memory for a BITMAPIFO Structure
HANDLE h_bmp_info = ::GlobalAlloc (GHND, sizeof (BITMAPINFO) + (sizeof (RGBQUAD) * 256));
BITMAPINFO* bmp_info = static_cast(::GlobalLock (h_bmp_info));
//Set up the structure
memset (bmp_info, NULL, sizeof (BITMAPINFO) + (sizeof (RGBQUAD) * 255));
bmp_info->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmp_info->bmiHeader.biPlan es = 1;
bmp_info->bmiHeader.biBitC ount = 8;
bmp_info->bmiHeader.biWidt h = bmp_w;
bmp_info->bmiHeader.biHeig ht = bmp_h;
bmp_info->bmiHeader.biComp ression = BI_RGB;

// find out how much memory for the bits
::GetDIBits (h_dc, h_mem_bmp, 0, bmp_h, NULL, bmp_info, DIB_RGB_COLORS);

Илон Маск рекомендует:  Многоязычность в рнр

// Allocate memory for the bits
HANDLE h_bits = GlobalAlloc (GHND, bmp_info->bmiHeader.biSize Image);
vo >
// this time get the bits
::GetDIBits (h_dc, h_mem_bmp, 0, bmp_h, bits, bmp_info, DIB_RGB_COLORS);

// fix up for bad video driver
if (is_pal_dev)
<
for (int i = 0; i palNumEntries; i++)
<
bmp_info->bmiColors[i].rgb Red = pal->palPalEntry[i].peRed;
bmp_info->bmiColors[i].rgb Green = pal->palPalEntry[i].peGree n;
bmp_info->bmiColors[i].rgb Blue = pal->palPalEntry[i].peBlue ;
>
free (pal);
>

// begin the printing
p->BeginDoc ();

// scale print size
int scale_x, scale_y;
if (p->PageWidth PageHeight)
<
scale_x = p->PageWidth;
scale_y = image->Picture->Height * (p->PageWidth / bmp_w);
>
else
<
scale_x = image->Picture->Width * (p->PageHeight / bmp_h);
scale_y = p->PageHeight;
>

// fix up for print with palette
is_pal_dev = false;
if (::GetDeviceCaps (h_dc, RASTERCAPS) & RC_PALETTE)
<
pal = static_cast(malloc (sizeof (LOGPALETTE) + (sizeof (PALETTEENTRY) * 256)));
memset (pal, 0, sizeof (LOGPALETTE) + (sizeof (PALETTEENTRY) * 256));
pal->palVersion = 0x300;
pal->palNumEntries = 256;
for (int i = 0; pal->palNumEntries; i++)
<
pal->palPalEntry[i].peRed = bmp_info->bmiColors[i].rgb Red;
pal->palPalEntry[i].peGree n = bmp_info->bmiColors[i].rgb Green;
pal->palPalEntry[i].peBlue = bmp_info->bmiColors[i].rgb Blue;
>
h_pal = CreatePalette(pal);
free (pal);
h_old_pal = SelectPalette(p->Canvas->H andle, h_pal, false);
is_pal_dev = true;
>

// send the bits to the printer
StretchDIBits(p->Canvas->H andle, 0, 0, scale_x, scale_y,
0, 0, bmp_w, bmp_h, bits,bmp_info, DIB_RGB_COLORS, SRCCOPY);

// end the print
p->EndDoc ();

// clean up
::DeleteObject (h_mem_bmp);
if (is_pal_dev)
<
::SelectObject (p->Canvas->Handle, h_old_pal);
::DeleteObject (h_pal);
>
::GlobalUnlock (bits);
::GlobalFree (h_bits);
::GlobalUnlock (bmp_info);
::GlobalFree (h_bmp_info);
>

Как напечатать изображения на TPrinter в реальном размере изображения?

Гретингс ко всем!

Как напечатать картины в Дельфи на TPrinter в реальных размерах картин? От холста TImage у меня есть хорошие результаты, но если я подрисовываю холст TPrinter, у меня есть ПЛОХОЙ результат, puctures слишком маленький, чем реальный размер битового массива.

Почему это происходит, Для чего я — потребность сделать, исправляют ошибку?

ОБНОВЛЕНИЕ

Да, я замеченный вопрос от намека на 1-й почте. Я не могу использовать код JCL/JVCL в своем проекте, но я получил идею от него.

Я создаю временный TImage и вычисляю размеры его в соответствии с фактором точек на дюйм принтера:

И потяните его на TPrinter. Холст.

Вы видите результаты ниже:

Результаты хороши, но не прекрасны.

Как вы видите в последней колонке, все изображения оттянуты не до конца, некоторая часть пропадает бумага и не оттянутая.

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

Экспериментами я знаю стоимость 0.20. 0.20 часть последних изображений колонки, в пикселях, это не оттянутое. Если я изменяю код, который получает масштабный коэффициент этим:

У меня есть это, в чем я нуждаюсь:

я думаю, что стоимость 0.20 не является константой, и она изменится на каждом PC. Как вычислить эту стоимость? Какая потребность решить эту проблему?

C++Builder

Вопросы программирования => Общие вопросы программирования в C++Builder => Тема начата: Yennifer от 30 Июнь 2009, 16:32:17

Название: Маштабирование TImage
Отправлено: Yennifer от 30 Июнь 2009, 16:32:17

спасибо за ответы, а огромное спс Tantos за код, но после того как увеличить рисунок нарисовать и уменьшить в изначальный размер изображение искажается, даже если толщину линий тоже увеличивать :(. тоесть есть различие между фигурой нарисованой без масштаба и в масштаба . выглядит вот так :


Режимы масштабирования с помощью SetStretchBltMode тоже все перепробовала и все равно изображение искаженное .

Если просто работать с растровой картинкой такие проблемы будут всегда.

Либо Вам надо хранить не изображение с нарисованными объектами, а непосредственно сами объекты. И отрисовывать их в соответствии с их свойствами и масштабом.

Либо искать компонент, который может это сделать за Вас. Я такое когда-то пользовал, но как его звали — забыл(под рукой нет)

Библиотека называется ImageEn, разработчик HiComponents:
http://www.hi-components.com/ndownloads.asp

При масштабировании изображения здесь используются специальные фильтры, позволяющие избавится от описанных Вами эффектов и не париться с хранением самих объектов. Визуально — при изменении своих размеров изображение как бы смазывается.

Компонент платный, но можно найти и другой вариант :)

Возможно, существуют другие библиотеки с подобным функционалом, я не знаю. Можно глянуть на torry.net

Результат:

  • Слева — 200% (увеличеная копия)
  • По центру — 100% (оригинал)
  • Справа — 50% (уменьшеная копия)

(http://img88.imageshack.us/img88/5872/zoom.png)

З.Ы.: Кстати в Paint толщина пера увеличивается прямо пропорционально зуму.

TImage [TImage] Как нарисовать текст на изображение в TImage, чтобы его потом можно было сохранить?

Вопрос

  • Новичок
  • Пользователи
  • 3 сообщения

Как вывести текст на изображение так, чтобы его можно было сохранить в .jpg формате.

P.S. Нет метода TextOut у Image.

Поделиться сообщением

Ссылка на сообщение
Поделиться на другие сайты

5 ответов на этот вопрос

Рекомендуемые сообщения

Похожий контент

Здравствуйте!
Есть самописный компонент — индикатор загрузки написанныый под VCL с использованием Direct2D.
TD2DProgressBar = > Затем беру
FInteropTarget.GetDC(D2D1_DC_INITIALIZE_MODE_COPY, FRenderDC); и вывожу на поверхность функцией

procedure TD2DProgressBar.UpdateWindow(sourceDC : HDC); var info : TUpdateLayeredWindowInfo; begin ZeroMemory(@info, sizeof(info)); with info do begin cbSize := sizeof(TUpdateLayeredWindowInfo); pptSrc := @FSourcePosition; pptDst := @FWindowPosition; psize := @FWndSize; pblend := @FBlend; dwFlags := ULW_ALPHA; end; info.hdcSrc := SourceDC; if not UpdateLayeredWindowIndirect(handle, @info) then begin RaiseLastOSError(); end end; Но это только под VCL.
В Firemonkey не нашел способа комбинировать градиенты и/или нарисовать арку градиентом (саму линию арки а не залить сектор) или комбинацией градиентов.

Как вывести этот FRenderTarget на канву Firemonkey-контрола?
Самая большая проблема в том, что компонент полупрозрачный, и вариант с переливом через Vcl.Graphics.TBitmap и MemoryStream не дает нужного результата.

MS:=TMemoryStream.Create; Blend.BlendOp := AC_SRC_OVER; Blend.BlendFlags := 0; Blend.AlphaFormat := AC_SRC_NO_PREMULT_ALPHA; Blend.SourceConstantAlpha:= 255; // // Уровень прозрачности Res:=Winapi.Windows.AlphaBlend(VCLBitmap.Canvas.Handle, 0, 0, VCLBitmap.Width, VCLBitmap.Height, FRenderDC, 0, 0, VCLBitmap.Width, VCLBitmap.Height, Blend); <или эта функция StretchBlt(bm.Canvas.Handle, 0, 0, VCLBitmap.Width, VCLBitmap.Height, FRenderDC, 0, 0, VCLBitmap.Width, VCLBitmap.Height, SRCCOPY); >VCLBitmap.SaveToStream(MS); FFMXBitmap.SetSize(TSize.Create(VCLBitmap.Width, VCLBitmap.Height)); FFMXBitmap.LoadFromStream(MS); FreeAndNil(MS);
В Blend пробовал разные комбинации BlendOp и AlphaFormat.
Хелп плизз!
Во вложении компонент под VCL. ( Может кому пригодится)) )
D2DProgressbar.zip

Добрый день!
Решил покопаться в своей старой спрайтовой игрушке, чтобы освежить в памяти знания и состряпать что-нибудь новое. Возникли сомнения, нормально ли сделано графическое отображение, можно ли доработать.
Все спрайты в дизайнтайме распиханы по Timagelist-ам. На старте приложения я загружаю битмапы из имэджлистов в свои обджектлисты, подгоняя под нужный размер.
MeduzasBitmpAr : array [1..numofMeduzas] of TObjectList ;
Дальше рисую по таймеру в основном окне игры Tpaintbox.OnPaint:

В принципе, даже на слабеньких телефончиках, всё вроде бодро. Но может, опытные товарищи чего подскажут, а то я 3ий день в собственном соку варюсь, ничего толкового.

Добрый день, идеология такая:
— создать битмап, рисовать на нем, не делая его видимым.
— нашлепать на канву панели подготовленный битмап.

На деле не получается нарисовать линию на битмапе. Т.е после процедуры Draw2 прожимаю процедуру Draw — получаю на панели красный прямоугольник битмапа без нарисованной линии.
Посоветуйте чего-нибуть, спасибо!


//BITMAP Bm:= TBitmap.Create; bm.W >

Столкнулся со следующей проблемой — TImage игнорирует установленные значения XRadius и YRadius у TRectangle (10.1 Berlin with update 2)

Суть — мне необходимо, чтобы у TRectangle углы были немного скругленные, для этого я устанавливаю XRadius и YRadius. Внутри TRectangle расположен TImage (левый верхний угол 0,0, ширина и высота совпадают с размерами TRectangle). Когда я загружаю картинку в TImage (что в дизайнере, что программно), получается что TImage отображается с прямыми углами, игнорируя XRadius и YRadius своего родителя. Свойство ClipChildren у TRectangle установлен.
Как сделать так, чтобы TImage скруглялся по углам? Что интересно, TCircle в этом плане работает, обрезая TImage.

Загружаю через opendialog картинку формата bmp в image
Есть переменные с:TColor, c1:Tcolor
Необходимо вначале узнать цвет определенного пикселя на загруженной картинке и записать в c1, а затем изменить цвет определенного пикселя на загруженной картинке на цвет, хранящийся в переменной c.
Ищу очень давно, но внятного объяснения нигде не нашла(

Последние посетители 0 пользователей онлайн

Ни одного зарегистрированного пользователя не просматривает данную страницу

Как напечатать изображения на TPrinter в реальном размере изображения?

Гретингс ко всем!

Как напечатать картины в Дельфи на TPrinter в реальных размерах картин? От холста TImage у меня есть хорошие результаты, но если я подрисовываю холст TPrinter, у меня есть ПЛОХОЙ результат, puctures слишком маленький, чем реальный размер битового массива.

Почему это происходит, Для чего я — потребность сделать, исправляют ошибку?

ОБНОВЛЕНИЕ

Да, я замеченный вопрос от намека на 1-й почте. Я не могу использовать код JCL/JVCL в своем проекте, но я получил идею от него.

Я создаю временный TImage и вычисляю размеры его в соответствии с фактором точек на дюйм принтера:

И потяните его на TPrinter. Холст.

Вы видите результаты ниже:

Результаты хороши, но не прекрасны.

Как вы видите в последней колонке, все изображения оттянуты не до конца, некоторая часть пропадает бумага и не оттянутая.

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

Экспериментами я знаю стоимость 0.20. 0.20 часть последних изображений колонки, в пикселях, это не оттянутое. Если я изменяю код, который получает масштабный коэффициент этим:

У меня есть это, в чем я нуждаюсь:

я думаю, что стоимость 0.20 не является константой, и она изменится на каждом PC. Как вычислить эту стоимость? Какая потребность решить эту проблему?

DelphiSite

Наиболее читаемое

Как распечатать TImage?

// Based on posting to borland.public.delphi.winapi by Rodney E Geraghty, 8/8/97.

procedure PrintBitmap ( Canvas: TCanvas; DestRect: TRect; Bitmap: TBitmap ) ;
var
BitmapHeader: pBitmapInfo;
BitmapImage: Pointer ;
HeaderSize: DWORD ;
ImageSize: DWORD ;
begin
GetDIBSizes ( Bitmap. Handle , HeaderSize, ImageSize ) ;
GetMem ( BitmapHeader, HeaderSize ) ;
GetMem ( BitmapImage, ImageSize ) ;
try
GetDIB ( Bitmap. Handle , Bitmap. Palette , BitmapHeader^, BitmapImage^ ) ;
StretchDIBits ( Canvas. Handle ,
DestRect. Left , DestRect., // Destination Origin
DestRect. Right — DestRect. Left , // Destination Width
DestRect. Bottom — DestRect., // Destination Height
0 , 0 , // Source Origin
Bitmap. Width , Bitmap. Height , // Source Width & Height
BitmapImage,
TBitmapInfo ( BitmapHeader^ ) ,
DIB_RGB_COLORS,
SRCCOPY )
finally
FreeMem ( BitmapHeader ) ;
FreeMem ( BitmapImage )
end
end ;

Печать timage

Основные упражнения не отмечены никакими специальными знаками, их выполнения достаточно для удовлетворительной оценки. Дополнительные упражнения отмечены «звездочками», их выполнение необходимо для получения повышенной оценки.

  • «5» — в отчете выполнены все основные упражнения, дополнительно выполнены упражнения с одной и двумя «звездочками».
  • «4» — в отчете выполнены все основные упражнения дополнительно выполнены упражнения с одной «звездочкой».
  • «3» — в отчете выполнены все основные упражнения.

Печать HTML-документа в Qt 5.8

23 января 2020 года вышла Qt версии 5.8, в которой появилась поддержка печати полноценных HTML-документов.

До этого возможность напечатать документ тоже была. Можно было:

  • Использовать метод QTextDocument::Print(). Но приходилось ограничиваться небольшими возможностями HTML и CSS.
  • Использовать метод QWebFrame::print(), который существовал пока не вышла Qt 5.6. Потом в Qt был окончательно заменен веб-движок и поддержка печати пропала.
  • Использовать печать в PDF с помощью метода QWebEnginePage::printToPdf(), который появился в Qt 5.7. Но печать в PDF — это не печать через принтер.
  • Вывести видимую часть страницы на печать методом QWebEngineView->render(). Но это плохой обходной путь, так как не вся страница будет выведена на печать и потребуется отобразить страницу.

В Qt 5.8 появился метод QWebEnginePage::print(), который выводит на печать HTML-документы без отрисовки в окне и поддерживает современные возможности HTML, CSS и JavaScript.

Следующий код выводит HTML-документ на принтер.

В файле проекта (*.pro) нужно подключить два модуля с помощью следующей строчки.

В коде используются лямбда-выражения, которые появились в C++11. Это конструкции вида: [. ] (. ) <. >, анонимные функции внутри функций. В Qt 5.8 по умолчанию включен C++11.

Класс QWebEnginePage обрабатывает, отрисовывает и печатает документы асинхронно с основным кодом программы, поэтому код в лямбда-функциях выполняется уже после того, как завершится метод on_printButton_clicked().

Надо внимательно следить за удалением объектов, чтобы не возникло утечки памяти и ошибки сегментации, особенно при печати нескольких документов в цикле. Объект принтера может быть одним, а выводимых на печать документов несколько. Тогда объект принтера надо удалять, после печати последнего документа, и не забывать, что печать происходит асинхронно. То есть функция print() завершается еще до вывода документа на печать.

Но и у этого способа печати есть огромный недостаток. К сожалению модуль Qt WebEngine, в который входит класс QWebEnginePage, недоступен при сборке проекта с помощью MinGW в Виндовс. Собрать проект в Виндовс можно только с помощью Visual Studio.

Илон Маск рекомендует:  Что такое код getmaxx
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL