1

KOL で TBitMap を PBitMap に変換したいと考えています。

これを試しましたが、出力として黒い画像が表示されます:

function TbitMapToPBitMap (bitmap : TBitMap) : PbitMap;
begin
 result := NIL;
 if Assigned(bitmap) then begin
  result := NewBitmap(bitmap.Width, bitmap.Height);
  result.Draw(bitmap.Canvas.Handle, bitmap.Width, bitmap.Height);
 end;
end;

何が問題なのですか?Delphi7を使用しています。

ご協力ありがとうございました。

編集: 新しいコード:

function TbitMapToPBitMap (const src : TBitMap; var dest : PBitMap) : Bool; 
begin
 result := false;
 if (( Assigned(src) ) and ( Assigned (dest) )) then begin
 dest.Draw(src.Canvas.Handle, src.Width, src.Height);
 result := true;
 end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
 TBitMapTest : TBitMap;
 PBitMapTest : PBitMap;
begin
 TBitMapTest := TBitMap.Create;
 TBitMapTest.LoadFromFile ('C:\test.bmp');
 PBitMapTest := NewBitMap (TBitMapTest.Width, TBitMapTest.Height);
 TbitMapToPBitMap (TBitMapTest, PBitMapTest);
 PBitMapTest.SaveToFile ('C:\test2.bmp');
 PBitMapTest.Free;
 TBitMapTest.Free;
end;
4

1 に答える 1

3

あなたの質問に答えるには、なぜターゲット画像が黒なのか; これは、これらのターゲット イメージをソースに描画し、NewBitmapイメージを黒に初期化したためです。

TBitmapKOLにコピーまたは変換する方法PBitmap1 つの方法しか見つかりませんでした (KOL でそのような機能を見逃した可能性がありますが、たとえそうであったとしても、次のコードで使用されている方法は非常に効率的です)。Windows の GDI 関数をビット ブロック転送に使用できますBitBlt。これは、指定された領域を 1 つのキャンバスから別のキャンバスにコピーするだけです。

次のコードは、ボタンをクリックすると VCL および KOL ビットマップ インスタンスを作成し、画像を VCL ビットマップにロードし、VCL から KOL ビットマップへのコピー関数を呼び出します。この関数が成功した場合は、KOL ビットマップをフォーム キャンバスに描画して解放します。両方のビットマップ インスタンス:

uses
  Graphics, KOL;

function CopyBitmapToKOL(Source: Graphics.TBitmap; Target: PBitmap): Boolean;
begin
  Result := False;
  if Assigned(Source) and Assigned(Target) then
  begin
    Result := BitBlt(Target.Canvas.Handle, 0, 0, Source.Width, Source.Height,
      Source.Canvas.Handle, 0, 0, SRCCOPY);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  KOLBitmap: PBitmap;
  VCLBitmap: Graphics.TBitmap;
begin
  VCLBitmap := Graphics.TBitmap.Create;
  try
    VCLBitmap.LoadFromFile('d:\CGLIn.bmp');
    KOLBitmap := NewBitmap(VCLBitmap.Width, VCLBitmap.Height);
    try
      if CopyBitmapToKOL(VCLBitmap, KOLBitmap) then
        KOLBitmap.Draw(Canvas.Handle, 0, 0);
    finally
      KOLBitmap.Free;
    end;
  finally
    VCLBitmap.Free;
  end;
end;
于 2012-06-23T16:36:13.587 に答える