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

#delphi #printing

#delphi #печать

Вопрос:

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

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

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

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

Комментарии:

1. Если вы «сгенерировали» «изображение» с помощью Windows GDI, то единственным разумным решением будет «сгенерировать» его непосредственно на холсте принтера. Если вы хотите разделить два процесса, сгенерируйте ЭДС и «воспроизведите» это на холсте принтера.

Ответ №1:

Вместо этого вы можете вызвать 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
);
  

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

Комментарии:

1. Это не так, как кажется на экране, но это отправная точка. Спасибо 1

2. С помощью растрового изображения вы не сможете заставить его отображаться так, как оно отображается на экране. Разрешение принтеров в 5-10 раз выше, чем разрешение экрана.

3. @Downvoter Не могли бы вы сообщить мне, почему вы считаете, что этот ответ «бесполезен»?

4. Даунвотер, вероятно, уже забыл об этом вопросе или вашем ответе. Видя, что примерно каждый ответ, который вы даете на данный момент, вы, вероятно, наступили кому-то на пятки и теперь приобрели своего личного заклятого врага, как @Andreas (по крайней мере, на одном этапе). Просто отпустите это. Даже если вы получите ответ, я чувствую, что вы не получите ничего полезного из такого разговора.

5. @David: Я знаю. Я также знаю, как / когда вы стояли на ногах, но не думал, что это имеет слишком большое значение.

Ответ №2:

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

Ответ №3:

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

Комментарии:

1. Нет PixelsPerInch TPrinter ввода . Возможно, вы думаете о TFont.PixelsPerInch .

2. Нет; он думает о GetDeviceCaps(Printer.Handle, LOGPIXELSX) (или LOGPIXELSY ). Смотрите здесь . Однако я бы использовал SCALEFACTORX (или Y ) вместо этого в качестве параметра flags.

3. @David и @Ken: ни то, ни другое не то, о чем я думал. Мне придется подождать до понедельника, когда я получу Delphi передо мной. Я помню, что видел более ранние обсуждения, в которых использовались фактические свойства TPrinter для решения проблем с размерами, но я пока не помню конкретных деталей.