中国开发网: 论坛: 程序员情感CBD: 贴子 284108
leejd: 代码是翻译过来了,但是执行结果不是我预期的,大牛们帮俺看看错在哪里了?
void SmoothStretchDraw(TRect rect)
{
void *lpBits;
PBitmapInfo pBmpInfo;
unsigned int nColors;
HDRAWDIB hdd;
TMemoryStream *pmStream = new TMemoryStream();
pBuff->Bitmap->SaveToStream(pmStream);

pBmpInfo = PBitmapInfo((char*)pmStream->Memory + sizeof(TBitmapFileHeader));
if (pBmpInfo->bmiHeader.biClrUsed == 1)
nColors = pBmpInfo->bmiHeader.biClrUsed;
else
nColors = pBmpInfo->bmiHeader.biBitCount << 1;
if (pBmpInfo->bmiHeader.biBitCount > 8)
{
if (pBmpInfo->bmiHeader.biCompression == BI_BITFIELDS)
lpBits = (char*)pBmpInfo->bmiColors + pBmpInfo->bmiHeader.biClrUsed + 3;
else
lpBits = (char*)pBmpInfo->bmiColors + pBmpInfo->bmiHeader.biClrUsed;
}
else
lpBits = (char*)pBmpInfo->bmiColors + nColors;
hdd = DrawDibOpen();
try
{
DrawDibRealize(hdd, Image->Canvas->Handle, true);
DrawDibDraw(hdd,
Image->Canvas->Handle,
rect.Left, rect.Top,
rect.Right, rect.bottom,
PBitmapInfoHeader( &pBmpInfo->bmiHeader ),
lpBits,
0, 0,
pBmpInfo->bmiHeader.biWidth, pBmpInfo->bmiHeader.biHeight,
DDF_BACKGROUNDPAL );
}
__finally
{
DrawDibClose( hdd );
}
delete pmStream;
}





原文-------------------------------------------
■サンプルコード
//=========================================================================
{...略...}
implementation

uses DrawDibAPI; {* 追加して下さい *}

{$R *.DFM}

var
bmpStream: TMemoryStream; {* Bitmap File 読み込み用MemoryStream *}

{--------------------------------------------------------------------------
Form OnCreate --- bmpStream を作成
//------------------------------------------------------------------------}
procedure TForm1.FormCreate(Sender: TObject);
begin
bmpStream := TMemoryStream.Create;
end;
{--------------------------------------------------------------------------
Form OnDestroy --- bmpStream を破棄
//------------------------------------------------------------------------}
procedure TForm1.FormDestroy(Sender: TObject);
begin
bmpStream.Free;
end;
{--------------------------------------------------------------------------
DrawDibDraw を使用した描画処理
Canvas : 対象となる Canvas を指定
dTop, dLeft : 描画開始位置
dHeight, dWidth : 描画領域のサイズ
BitmapStream : 描画対象Bitmapが入ったMemoryStream
//------------------------------------------------------------------------}
procedure DDDraw( Canvas: TCanvas; dTop, dLeft, dHeight, dWidth: Integer;
BitmapStream: TMemoryStream );
var
lpBits : Pointer; {* ビットマップビット格納先へのポインタ *}
pBmpInfo: PBitmapInfo; {* BitmapInfo構造体へのポインタ *}
nColors : Cardinal; {* パレットカラー格納数 *}
hdd : HDRAWDIB; {* 描画のための DrawDib DC *}
{- 描画領域に収まるように縦横等倍縮小 -------------------------------}
procedure SetSize;
var
RatioH, {* 高さの比 *}
RatioW : Extended; {* 幅の比 *}
begin
with pBmpInfo^.bmiHeader do begin
if ( biWidth > dWidth ) or ( biHeight > dHeight ) then
begin
RatioH := dHeight / biHeight;
RatioW := dWidth / biWidth;
if RatioH > RatioW then RatioH := RatioW;
dHeight := Trunc( biHeight * RatioH );
dWidth := Trunc( biWidth * RatioH );
Exit;
end;{if ( biWidth > dWidth ) or ( biHeight > dHeight ) then}
dHeight := biHeight;
dWidth := biWidth;
end;{with pBmpInfo^.bmiHeader do}
end;
{- End --------------------------------------------------------------}
begin
{* BitmapInfo構造体のアドレスを計算 *}
pBmpInfo := PBitmapInfo( PChar( BitmapStream.Memory )
+ SizeOf(TBitmapFileHeader) );
with pBmpInfo^, bmiHeader do begin
{* パレットカラー格納数を取得 *}
if biClrUsed = 1 then
nColors := biClrUsed
else
nColors := ( 1 shl biBitCount );
{* 各ビット数に合わせてビットマップビット配列のアドレスを計算 *}
if biBitCount > 8 then
begin
lpBits := PChar( @bmiColors ) + Ord( biClrUsed )
+ Ord( biCompression = BI_BITFIELDS ) * 3;
end
else lpBits := PChar( @bmiColors ) + nColors;
{* 描画のために DrawDib デバイスコンテキストを作成 *}
hdd := DrawDibOpen;
try
{* DrawDib DC のパレットを実体化 *}
DrawDibRealize( hdd, Canvas.Handle, True );
{* 描画サイズ設定 *}
SetSize;
{* 画像表示 *}
DrawDibDraw( hdd,
Canvas.Handle,
dLeft, dTop,
dWidth, dHeight,
PBitmapInfoHeader( @bmiHeader ),
lpBits,
0, 0,
biWidth, biHeight,
DDF_BACKGROUNDPAL );
//↑背景パレットに DrawDib DC のパレットを選択
finally
{* DrawDib DC を閉じ、割り当てたリソースを解放 *}
DrawDibClose( hdd );
end;{try..finally..}
end;{with pBmpInfo^ do}
end;
{--------------------------------------------------------------------------
Button1 OnClick
//------------------------------------------------------------------------}
procedure TForm1.Button1Click(Sender: TObject);
var
FileName: String;
begin
{* 実行ファイルと同じフォルダ内の'Test.bmp'を表示させる場合 *}
FileName := ExtractFilePath( ParamStr(0) ) + 'Test.bmp';
if not FileExists( FileName ) then Exit;
{* BitmapファイルをbmpStreamに読み込む *}
bmpStream.LoadFromFile( FileName );
{...略...}
{* Form1のCanvasに描画 *}
DDDraw( Canvas, 0, 0, ClientHeight, ClientWidth, bmpStream );
end;
{--------------------------------------------------------------------------
//------------------------------------------------------------------------}
{...略...}
end.
//=========================================================================

相关信息:


欢迎光临本社区,您还没有登录,不能发贴子。请在 这里登录