Печать реальных размеров изображения - PullRequest
3 голосов
/ 15 октября 2011

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

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

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

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

Ответы [ 3 ]

5 голосов
/ 15 октября 2011

Вы можете позвонить 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 голосов
/ 15 октября 2011

Вы должны добиться лучших результатов, если вы измените размер изображения до промежуточного растрового изображения (с размером, подходящим для разрешения принтера), используя один из ресамплеров в 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;
0 голосов
/ 15 октября 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...