画像を拡大して印刷するには?

解決


マリモ  2006-10-17 22:28:41  No: 23585  IP: 192.*.*.*

Imageの画像を拡大して、印刷処理を行いたいのですが

『Microsoft Office Document Image Writer』に出力すると、うまく印刷されています。
直接プリンターに出力すると、印刷されません。

直接プリンターに出力したいのですが、何が原因で、どのように解決すればよいのか分かりません。

御存知の方あれば宜しくお願いします。

環境は Delphi5  WinXPです。
TNkPrinterコンポーネントを使用しています。


procedure StretchImage(Image : TImage);
var
  TempBmp : Tbitmap;
begin
  TempBmp :=TBitmap.Create;

  TempBMP.Width := 1900;
  TempBMP.Height := 800;

  StretchBlt(TempBmp.Canvas.Handle,0,0,Tempbmp.Width,TempBmp.Height,
             Image.Canvas.Handle,0, 0,Image.Width, Image.Height, SRCCOPY);

  Image.Picture.Bitmap.Assign(TempBmp);
  TempBmp.Free;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  BMP : TBitmap;
begin
  Bmp := TBitmap.Create;
  try
    StretchImage(Image1);

    Bmp.Assign(Image1.Picture);

    NkPrinter.BeginDoc('');

    NkPrinter.Canvas.Draw(1000, 230, BMP);

    NkPrinter.EndDoc;
  finally
    BMP.Free;
  end;
end;

編集 削除
かみづ  2006-10-17 22:55:08  No: 23586  IP: 192.*.*.*

> Image.Canvas.Handle,0, 0,Image.Width, Image.Height, SRCCOPY);

Image.Picture.Bitmap.Canvas.Handleでは?

編集 削除
マリモ  2006-10-18 08:16:07  No: 23587  IP: 192.*.*.*

> Image.Picture.Bitmap.Canvas.Handleでは?

何も変わりありませんでした。

編集 削除
おっふぉ  2006-10-18 08:35:49  No: 23588  IP: 192.*.*.*

>   Image.Picture.Bitmap.Assign(TempBmp);

ここの前にTempBmpをファイルに保存したら、中身はちゃんとある?

編集 削除
マリモ  2006-10-18 10:15:01  No: 23589  IP: 192.*.*.*

>>   Image.Picture.Bitmap.Assign(TempBmp);

>ここの前にTempBmpをファイルに保存したら、中身はちゃんとある?


  TempBmp.SaveToFile('c:\aaa.bmp');

を追加したところ、aaa.bmp には拡大された画像が保存されました。

編集 削除
SON705  2006-10-18 14:43:59  No: 23590  IP: 192.*.*.*

TNkPrinterコンポーネントを持っていないので印刷はノーチェックですが、
下記の方法ではどうでしょうか?

procedure TForm1.Button1Click(Sender: TObject);
var
        DstRect: TRect;
        Dst: TImage;
begin
    Dst := TImage.Create( Self );
    Dst.Width  := 1900;
    Dst.Height :=  800;
    DstRect := Rect( 0, 0, Dst.Width, Dst.Height );
    Dst.Canvas.StretchDraw( DstRect, Image1.Picture.Bitmap );

    NkPrinter.BeginDoc('');
    NkPrinter.Canvas.Draw( 1000, 230, Dst.Picture.Bitmap );
    NkPrinter.EndDoc;

    Dst.Free;
end;

編集 削除
マリモ  2006-10-18 18:34:51  No: 23591  IP: 192.*.*.*

procedure StretchImage(Image : TImage);
を使用せずに

NkPrinter.Canvas.StretchDraw(Rect(0, 0, 1900, 800),Image1.Picture.Bitmap);

としてみると、うまく拡大印刷されました。


http://www.geocities.co.jp/SiliconValley-SanJose/2560/delphi4/graphics/PaintImage.htm
↑にDrawメソッドの第三パラメーターはTGraphic型で、TGraphic型は抽象クラスのため、インスタンス化できないということでした。

しかし、StretchDrawもTGraphic型ですよね・・・?

SON705さんの方法も検証してみました。
NkPrinter.Canvas.Draw( 1000, 230, Dst.Picture.Bitmap );
では印刷されず、現象は変わりありませんでした。

Delphiのヘルプに
「グラフィックを実際のサイズで描画するには,StretchDraw ではなく Draw メソッドを使います。」
とありましたが、サイズ変更したイメージは、Drawメソッドでは描画できないということでしょうか?

とりあえず、印刷できましたので解決とします。

かみづさん、おっふぉさん、SON705さん、どうもありがとうございました。

編集 削除