{1.}uses
printers;
procedure TForm1.Button1Click(Sender: TObject);
var
ScaleX, ScaleY: Integer;
RR: TRect;
beginwith Printer dobegin
BeginDoc;
// Mit BeginDoc wird ein Druckauftrag initiiert. // The StartDoc function starts a print job. try
ScaleX := GetDeviceCaps(Handle, logPixelsX) div PixelsPerInch;
ScaleY := GetDeviceCaps(Handle, logPixelsY) div PixelsPerInch;
// Informationen uber die Auflosung // Retrieves information about the Pixels per Inch of the Printer.
RR := Rect(0, 0, Image1.picture.Width * scaleX, Image1.Picture.Height * ScaleY);
Canvas.StretchDraw(RR, Image1.Picture.Graphic);
// An die Auflosung anpassen // Stretch to fit finally
EndDoc; //Methode EndDoc beendet den aktuellen Druckauftrag und schlie?t die // Textdatei-Variable. // Steht in finally - um auch bei Abbruch des Druckauftrages Papierausgabe // sicherzustellen end;
end;
end;
{2.}// 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.Top, // Destination Origin
DestRect.Right - DestRect.Left, // Destination Width
DestRect.Bottom - DestRect.Top, // 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)
endend{PrintBitmap};
Программирование на Delphi: печать изображения и битмапа
Код 1: печать изображения
Этот код печатает изображение на принтере с помощью компонента Printer в Delphi. Процедура Button1Click вызывается при клике кнопки, и она выполняет следующие шаги:
Инициализирует принтер, вызвав BeginDoc.
Получает устройственное разрешение (пикселей на дюйм) принтера.
Вычисляет коэффициенты масштабирования (ScaleX и ScaleY) для преобразования пикселей в дюймы.
Создает прямоугольник (RR) , представляющий изображение на бумаге принтера, учитывая коэффициенты масштабирования.
Вызывает Canvas.StretchDraw для рисования изображения на канвасе, растягивая его до размера бумаги.
Наконец, вызывает EndDoc для закрытия печатной работы.
Код 2: печать битмапа
Этот код печатает битмап (графическое изображение) с помощью компонента TBitmap в Delphi. Процедура PrintBitmap принимает три параметра:
Canvas: канвас для рисования.
DestRect: прямоугольник, где должен быть нарисован битмап.
Bitmap: битмап для печати.
Код выполняет следующие шаги:
Получает размер заголовка и данных битмапа с помощью GetDIBSizes.
Распределяет память для заголовка и данных битмапа с помощью GetMem.
Вызывает GetDIB для получения данных битмапа, включая его палитру и изображение.
Вызывает StretchDIBits для рисования битмапа на канвасе, растягивая его до размера прямоугольника назначения.
Альтернативное решение:
Если вы хотите печатать изображение без использования встроенных компонентов печати Delphi, можно использовать функции API Windows GDI CreateCompatibleDC, SelectObject и BitBlt. Вот пример:
В этом коде создается памятный устройственный контекст (hMemDC), выбирается битмапа как текущий объект, и затем используется BitBlt для рисования битмапы на принтерском DC (hDC). Обратите внимание, что этот код предполагает, что вы уже установили свой принтерский DC с помощью функций API Windows, таких как CreateDC или OpenPrinter.
В статье описывается два способа распечатать изображение в Delphi: с использованием класса TPrinter и процедуры PrintBitmap, которая позволяет масштабировать и выводить растровое изображение на печатающее устройство.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.