私のアプリケーションは Delphi 6 で開発されています。これは、バックグラウンド処理と大量のデータ (約 60MB ~ 120MB の物理メモリを消費する) のため、リソースを大量に消費するアプリケーションです。このアプリケーションの機能の 1 つは、バーコード イメージを作成して印刷することです。ユーザーがバーコードを生成し続けると、10 個のバーコードのうち少なくとも 1 個の行が欠落しています。
TExcellenImagePrinter コンポーネントを使用して、この問題を解決できました。しかし、それはパフォーマンスを大幅に低下させました。この解決策はクライアントによって拒否されたため、WinAPI StretchDIBits 呼び出しを GDI+ に置き換えようとしています。
元のソースコードは次のとおりです。
procedure PrintBitmap(ARect:TRect; Bitmap:TBitmap);
var
Info: PBitmapInfo;
InfoSize: dword{Integer};
Image: Pointer;
ImageSize: dword{ integer};
iWidth,iHeight :integer;
iReturn : integer ;
begin
GetDIBSizes(Bitmap.handle,InfoSize,ImageSize);
if (LoadDIBFromTBitmap(Bitmap,Pointer(Info),Image,iWidth,iHeight)) then
begin
SetStretchBltMode(Printer.Canvas.handle,STRETCH_HALFTONE);
SetBrushOrgEx(Printer.Canvas.handle, 0, 0, NIL);
iReturn := StretchDIBits(Printer.Canvas.Handle, ARect.Left, ARect.Top,
ARect.Right - ARect.Left, ARect.Bottom - ARect.Top,
0, 0, Info^.bmiHeader.biWidth,
Info^.bmiHeader.biHeight, Image, Info^,DIB_RGB_COLORS, SRCCOPY);
end;
FreeMemEx(Info);
FreeMemEx(Image);
end;
エンバカデロ フォーラム ( https://forums.embarcadero.com/thread.jspa?messageID=471501#471501 ) でジョーが提案したように、( http://www.progdigy.com/?page_id=7 )から GDI+ ヘッダーを取得しました。 )。
ソースコードを次のように変更しました。
TGPGraphics クラスのオブジェクトを作成し、プリンターのハンドルをそれに割り当てました。
gp := TGPGraphics.Create(Printer.Canvas.Handle);
TGPBitmap クラスのオブジェクトを作成し、バーコード イメージを割り当てます。
bmp := TGPBitmap.Create(Info^,Image);
Info は TBitmapInfo で、Image はポインタです。
- プリンターのディメンションをTGPRect レコードのインスタンスrectに割り当てました
DrawImage 関数を呼び出します:
gp.DrawImage(bmp,rect);
ただし、これらの変更を行った後、プリンターの出力に空の画像が表示されます。私が何かを見逃していたり、私の実装が間違っていたりした場合は指摘できますか? これに関する指針を提供できますか?