3

Delphi 7には、TCanvasコンポーネントを使用して情報を出力するライブラリがあります。結果の画像は約4800*6000ピクセルで、印刷してとして保存したいと思います.jpeg

これを実現するために、TBitmapを作成し、そのCanvasをパラメーターとしてライブラリに指定してから、ビットマップをjpegに割り当てました。どうやら、これはメモリを大量に消費しているようです。ビットマップの幅と高さを設定しようとすると、「このコマンドを処理するのに十分なストレージがありません」という例外が発生するためです。

// output to printer
Printer.BeginDoc();
doPrint(Printer.Canvas);
Printer.EndDoc();

// output in bmp.Canvas
bmp := TBitmap.Create;
bmp.Width := Printer.PageWidth;
bmp.Height := Printer.PageHeight; // <- BAM! Exception!
doPrint(bmp.Canvas);

// save as jpeg
jpg := TJPEGImage.Create;
jpg.Assign(bmp);
jpg.SaveToFile('...');

// free
bmp.Free();
jpg.Free();

私は何が間違っているのですか?Printer.Canvasを.jpegファイルとして直接保存できますか?

編集:画像サイズの概算を2000*2000から4800*6000に更新しました

4

10 に答える 10

3

Graphic32( http://www.graphics32.org/wiki/)のTBitmap32を使用して大きなビットマップを処理できるはずです。

于 2009-10-29T02:25:54.367 に答える
2

Ben Zieglerが示唆しているように、bmpのサイズを変更する前に、bmpのpixelformatを何かに設定する必要があります。これはすべての違いを生みます。

于 2009-10-29T16:54:16.537 に答える
1

このエラーは、ビットマップのサイズをデスクトップのサイズよりも大きいサイズに設定した場合に発生します。このエラーを回避するには、次の方法でデバイスに依存しないビットマップを作成できます。

bmp := TBitmap.Create;
bmp.HandleType := bmDIB;
bmp.Width := Printer.PageWidth;
bmp.Height := Printer.PageHeight; 

このソリューションが必要かどうかは、ビデオカードの機能によって異なります。1つのセッションに割り当てられたビデオRAMが少ないターミナルサーバーの状況では、このエラーが頻繁に発生しました。このソリューションを使用すると、ビデオカードのメモリではなく通常のRAMをビットマップに使用するようにDelphiに強制します。

于 2012-09-25T10:02:12.717 に答える
0

DelphiのTBitmapクラスには、このような大きなビットマップの処理に問題があります。いいえ、TCanvasを.jpgファイルに直接保存することはできません。

于 2009-10-28T20:44:05.620 に答える
0

自分のマシン(Windows XP、Delphi 2006)で次のコードを試しましたが、例外は発生しませんでした。どのOSを使用していますか?

  procedure TForm3.Button3Click(Sender: TObject);
  var
     bmp : TBitmap;
  begin
     bmp := TBitmap.Create;
     bmp.PixelFormat := pf32bit;
     bmp.Width := 6000;
     bmp.Height := 4800;
     bmp.Free;
  end;
于 2009-10-28T21:56:07.503 に答える
0

mghieが言ったように:それはあなたのシステムに大きく依存します大きなビットマップに関するEFGsコンピュータラボを見てください

于 2009-10-29T08:24:21.467 に答える
0

PixelFormatをpf32bitまたはpf24bitに設定してみてください(例としてBen Zieglerによる)。ほとんどの場合、このPixelFormatでうまくいきます(私が覚えているように、主にXPでした)。あなたはここでより多くの情報を見つけることができます。

于 2009-10-29T21:09:49.140 に答える
0

これはJPEG形式ではありません。この仕様では、32767x32767ピクセルまでのビットマップが許可されています。

問題は、大きなビットマップの大量のmem消費、最終的にWindowsプラットフォームまでたどることができるTCanvasの制限です。

私のNativeJpgライブラリは、視覚化とは別にJPEG処理をデコードします。たとえば、「ストリップバイストリップ」を使用してそのようなJPEGを保存すると、結果としてより管理しやすいビットマップタイルが得られます。

NativeJpgはオープンソースであり、このライブラリはここからダウンロードできます: http ://www.simdesign.nl/forum/viewforum.php?f=16

tiledemoを見て、巨大な人工JPEG画像を作成して保存する方法を確認してください。

よろしく、ニルス

于 2011-07-09T23:59:22.317 に答える
0

消費するメモリを減らすために、いつでも小さなビットマップを作成してみることができます。プリンタの高さを10で割ったり、最大の高さを1000に設定したりするとします。これは単なる提案であり、自分のケースに当てはまるかどうかはわかりません。1ページに複数の画像が表示されます。

于 2012-09-25T10:12:42.567 に答える
-1

これが機能するか役立つかはわかりません。ただし、コンポーネントをjpegに保存する関数を作成しました。

    function SaveComponentToJPeg(mControl: TWinControl): TJpegImage;
    var
      bmp: TPicture;
      jpg : TJpegImage;
      dc: HDC;
      wnd: HWND;
      Params: array[0..255] of Char;

    begin
      bmp:=TPicture.Create;
      jpg := TJpegImage.create;
      try
        bmp.Bitmap.Width  := mControl.Width  - 05;  // Deduct for border.
        bmp.Bitmap.Height := mControl.Height -05;  // Deduct for border.
        wnd               := mControl.Handle;  //ctiveWindow;
        dc                := GetDc(wnd);
        BitBlt(bmp.Bitmap.Canvas.Handle,0,0,bmp.Width,bmp.Height,dc,0,0,SrcCopy);
        ReleaseDc(wnd, dc);
        jpg.assign(bmp.bitmap);
        result := jpg
      finally
        bmp.Free;
      end;
    end;
于 2009-10-30T05:39:28.757 に答える