TBitmap をきれいに印刷する
|
TBitmap 印刷用手続きの中村@NECさんバージョンです。
StretchDIBits を使うところがミソだそうです。
procedure StretchDrawBitmap(Canvas: TCanvas; // 描画先キャンバス
r: TRect; // 描画先の範囲
Bitmap: TBitmap // ビットマップ
);
var OldMode: Integer; // StretchMode のセーブ
Info: PBitmapInfo; // DIB ヘッダ + カラーテーブル
InfoSize: Integer; // DIB ヘッダ + カラーテーブル
Image: Pointer; // DIB のピクセルデータ
ImageSize: Integer; // DIB のピクセルデータのサイズ。
begin
// DIB の「ヘッダ+カラーテーブル」の大きさと ピクセル
// データの大きさを求める
GetDIBSizes(Bitmap.Handle, InfoSize, ImageSize);
Info := Nil;
Image := Nil;
try
// DIB 用のメモリーを確保
Info := AllocMem(InfoSize);
Image := Allocmem(ImageSize);
// DIB を取り出す
GetDIB(Bitmap.Handle, Bitmap.Palette, Info^, Image^);
// 描画!!
OldMode := SetStretchBltMode(Canvas.Handle, COLORONCOLOR);
StretchDIBits(Canvas.Handle,
r.Left, r.Top,
r.Right - r.Left, r.Bottom - r.Top,
0, 0, Info^.bmiHeader.biWidth,
Info^.bmiHeader.biHeight,
Image, Info^, DIB_RGB_COLORS, SRCCOPY);
SetStretchBltMode(Canvas.Handle, OldMode);
finally
if Info <> Nil then FreeMem(Info);
if Image <> Nil then FreeMem(Image);
end;
end;
|
|