Печать реальных размеров изображения

Привет, товарищи! Я хочу напечатать сгенерированное мной изображение. Я использую следующий код

  Printer.BeginDoc;
  Printer.Canvas.Draw(0,0,img1.Picture.Bitmap);
  Printer.EndDoc;

Это работает, но изображение, которое он печатает, очень маленькое. Как я могу напечатать фактический размер изображения, как оно появляется на экране?

Спасибо большое.

delphi,printing,

3

Ответов: 3


против 5 принят

Вы можете позвонить Canvas.StretchDraw()вместо. Однако будьте готовы к тому, что результаты будут менее впечатляющими. Попытка масштабировать растровое изображение таким способом приведет к очень блочным результатам. Векторные изображения - это то, что вам нужно для масштабирования до разрешения принтера.

var
  Scale: Integer;
...
Scale := Min(
  Printer.PageWidth div Bitmap.Width,
  Printer.PageHeight div Bitmap.Height
);
Printer.Canvas.StretchDraw(
  Rect(0, 0, Bitmap.Width*Scale, Bitmap.Height*Scale), 
  Bitmap
);

Масштабирование, которое я выбрал здесь, сохранит соотношение сторон и сделает изображение максимально большим при печати.


3

Вы должны добиться лучших результатов, если вы измените размер изображения до промежуточного растрового изображения (с размером, подходящим для разрешения принтера), используя один из ресамплеров в JCL или Graphics32, а затем напечатаете растровое изображение с измененным размером.

Следующая процедура попытается получить тот же размер принтера, что и на экране:

uses
  JclGraphics;

procedure PrintGraphic(source: TGraphic);
var
  dest: TBitmap;
  destWidth, destHeight,
  printerPixelsPerInch_X,  printerPixelsPerInch_Y,
  printerLeftMargin, printerTopMargin: integer;
begin
  printerPixelsPerInch_X := GetDeviceCaps(Printer.Handle, LOGPIXELSX);
  printerPixelsPerInch_Y := GetDeviceCaps(Printer.Handle, LOGPIXELSY);
  printerLeftMargin      := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETX);
  printerTopMargin       := GetDeviceCaps(Printer.Handle, PHYSICALOFFSETY);

  dest := TBitmap.Create;
  try
    destWidth  := source.Width  * printerPixelsPerInch_X div Screen.PixelsPerInch;
    destHeight := source.Height * printerPixelsPerInch_Y div Screen.PixelsPerInch;

    Stretch(destWidth, destHeight, rfLanczos3, 0, source, dest);

    Printer.BeginDoc;
    try
      Printer.Canvas.Draw(printerLeftMargin, printerTopMargin, dest);
      Printer.EndDoc;
    except
      Printer.Abort;
      raise;
    end;
  finally
    dest.Free;
  end;
end;

procedure TFormMain.Button1Click(Sender: TObject);
begin
  if not PrinterSetupDialog.Execute then
    exit;

  PrintGraphic(Image1.Picture.Graphic);
end;

IIRC (сейчас у меня нет Delphi для проверки), TPrinterимеет PixelsPerInchили аналогичное свойство, которое необходимо установить, чтобы печать имела правильное разрешение. Значение по умолчанию не соответствует экрану, поэтому изображение печатается так мало. Большинство новичков в использовании TPrinterне знают, как установить свойство.

Дельфы, печать,
Похожие вопросы