グラフィック(画像)を適切なサイズで印刷するには?

解決


Delphi大好き  2009-01-29 23:24:53  No: 33249

初めて書き込みします。
検索でここにたどり着きました。
XPにてTurboDelphi2006無料版とDelphi3を使用しています。

画像を正常に印刷出来ず困っています。

A4の用紙に、画像を印刷した場合、
左上端に2センチ四方に、縮小されて印刷されてしまいます。

用紙全体に写真を印字したいのですが、
何度試しても上記のエラーになり困っています。

初代DelphiやDelphi2等の参考書を元に、以下のコードで試したのですが、
正常に印刷されません。
XP環境では異なるコードでないと駄目なのでしょうか?

もし詳しい方がおりましたら、誰かご指南下さると助かります。

with printer do begin
    begindoc;
    canvas.Draw(0,0,image1.Picture.Bitmap);
    enddoc;
  end;


TS  2009-01-30 00:19:24  No: 33250

>何度試しても上記のエラーになり困っています。
>正常な動作です、プリンターの解像度に合わせて拡大しないといけません。

Mr.XRAYさんのホームページをご存じですか
http://mrxray.on.coocan.jp/Delphi/plPrev/index.htm


どやさ  2009-01-30 19:41:13  No: 33251

TPrinter を使って印刷すればいいのですよ。
詳しくはヘルプを見てください。

TPrinter の Canvas は
プリンターの解像度(800DPIとすれば)により余白無しの場合
A4(210mmx298mm)であれば 
Printer.Canvas = 6614dot x 9354dot 
のキャンバスが存在することになるなのです

つまり、6614x9354 のビットマップを印刷するとA4前面に印刷されます。

Printer.Canvas に ビットマップデータを
表示したい位置に拡大など好きなように行って印刷してください。


おまけに  2009-01-30 21:54:37  No: 33252

Win32APIにGetDeviceCapsがあり
これを使うとPrinterのPixels Per Inchが調べられます。


delphi大好き  2009-01-31 00:04:33  No: 33253

色々ありがとうございます、
早速試してみたいと思います。
コンポーネントは、昨日こちらでも過去検索で
NKPrinterというコンポーネントを見つけ、
早速インストールしてみました。

今日の夜にもTPRINTERで早速試してみます。
APIもありがとうございます、早速参考書で調べて使ってみたいと思います。


delphi大好き  2009-01-31 05:03:51  No: 33254

何故か仕事場のプリンタが動かなくなったので、自宅のMypcから試してます。

印刷プレビューコンポーネントは、
手持ちのdelphi3&無料版TurboDelphiでは使えませんでした;
NKPrinterは無事インストールできデモも問題なく使えました^^

が、TPrinterの使い方がまるで判りませんでした;;
無理やり下のように書いてみましたが、実行時エラーに・・・TT
自分にはまだ難しすぎというか力量不足でした^^;
コード例を載せてもらえると、ものすごく助かります^^。

var
  p:TPrinter;
begin
  with p do begin
    begindoc;
    canvas.Draw(0,0,image1.Picture.Bitmap);
    enddoc;
  end;
end;


ありがとうございます  2009-01-31 08:55:44  No: 33255

無事解決しました^^。

過去トピックのコード例(全体画面を印刷するには?)を参考にしたところ、
無事印刷サイズを自由に変えられるようになりました。
ありがとうございます、助かりましたm(__)m。
プログラミングには色んな手法があるのですね^^。


Mr.XRAY  URL  2009-01-31 21:00:34  No: 33256

Mr.XRAYです.
TS さん,紹介していただきありがとうごさいます.

「ありがとうございます」さん,こんにちは.
既に解決済みで,また用途も違うようですか,

>手持ちのdelphi3&無料版TurboDelphiでは使えませんでした;

拙作のコンポーネント類はDelphi5以上でないと使用できません.
プリンタ設定と印刷プレビュー制御コンポは,多少の(uses部等)を修正すれば
使用可能となりますが面倒です.
(Delphi3.1で使用している方もいらっしゃいます)

また,TurboDelphi2006(?)であれば使用可能です.
ただしTurboDelphi2006(?)では,コンポーネントのインストールはできません.
したがって,コンポーネントを実行時に生成して利用することになります.

もし必要な状況になった時にでも参考にしてください.


ありがとうございます^^  2009-02-01 06:18:11  No: 33257

アドバイスありがとうございます、
質問者のDelphi大好きです。

お蔭様でソフトが完成しました^^!!
JPEGの使い方も、過去ログを参考にして学習させていただきました^^。
とても助かります。

delphi3.1でも使えるのですね^^
先ほどチャレンジしましたが、案の定挫折しました^^;。
気長にチャレンジしてみます^^。
TurboDelphi2006です^^。
無料版でも実行時生成で使えるのですね^^。
勉強になりますm(__)m。

最後になりますが、過去トピックを参考にして、
以下のコードで落ち着きました^^。

本当に助かりましたm(__)m。
それではありがとうございました^^。

var
  Rect: TRect;
  pheight,pwidth: integer;
begin
  pheight := 4000 div image2.Height;
  pwidth  := 4000 div image2.Width;

  pheight := image1.Height * pheight;
  pwidth  := image1.Width  * pwidth;
 
  Rect.Top  := 0;
  Rect.Left := 0;
  Rect.Right  := pwidth;
  Rect.Bottom := pheight;

  Printer.BeginDoc;
  Printer.Canvas.StretchDraw(Rect, image1.Picture.Bitmap);
  Printer.EndDoc;
end;


Mr.XRAY  URL  2009-02-01 06:53:19  No: 33258

Mr.XRAYです.

>delphi3.1でも使えるのですね^^

変更修正は,ある程度コンポーネント作成の知識が必要です.
また,次回のバージョンアップでは,完全にDelphi6以降でないと利用できなります (^^;
使用しない方が無難でしょう(笑)

コード拝見しました,ほとんど同じですが,印刷プレビューコンポを使用したコードです.
実行時に生成して使用する方法にはバグがあります.特にプレビューフォームの
位置やサイズの設定に問題があります.
以下はプレビューをしない場合のコードです.
拙作コンポの宣伝ですね.

//=============================================================================
//  印刷プレビュー制御コンポーネントを実行時に生成して利用する方法
//  プレビューしないですぐ印刷する場合
//  Image1に表示しているビットマップ画像を印刷
//
//  usesにplSetPrinter,plPrevが必要
//  plSetPrinter.pasとplPrev.pasはバスの通った場所(フォルダ)に置いておくこと
//  またpoLandscapeの使用にはusesにPrintersが必要
//  TplPrevはVer 4.81以上を使用のこと
//=============================================================================
procedure TForm1.Button2Click(Sender: TObject);
var
     plPrev1 : TplPrev;
     ARect   : TRect;
     ARatio  : Double;
begin
    //印刷プレビュー制御コンポーネントを生成
    plPrev1 := TplPrev.Create(Self);
    plPrev1.plSetPrinter := nil;
    //プリンタや用紙の設定はここで行(ここでは用紙を横向き)
    plPrev1.plSetPrinter.Orientation := poLandscape;

    try
      //描画コード開始
      plPrev1.BeginDoc;
      try
        //印刷位置を設定
        Image1.Picture.Width;
        Image1.Picture.Height;
        ARatio := Image1.Picture.Height/Image1.Picture.Width;
        ARect.Left   := 200;   //印刷位置の左端(20mm)
        ARect.Right  := 1800;  //印刷位置の右端(180mm)
        ARect.Top    := 300;   //印刷位置の上端(30mm)
        ARect.Bottom := Round((ARect.Right-ARect.Left)*ARatio)+ARect.Top;
        plPrev1.StretchDrawBitmap(ARect,Image1.Picture.Bitmap);
      finally
        //描画コード終了
        plPrev1.EndDoc;
      end;
      //プレビューしないですぐに印刷
      plPrev1.Print;
    finally
      FreeAndNil(plPrev1);
    end;
end;


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加