0

KOL コンポーネントと JPegObj で Delphi7 を使用しています。PBitmap を PJpeg に転送するにはどうすればよいですか?

var 
 MyBitmap : PBitMap;
 MyJpeg   : PJpeg;
begin
 MyBitMap := ....;
 MyJPeg.Bitmap.Assign (MyBitMap); // ===> Wrong?
 MyJPeg.SaveToFile ('C:\test.jpg');
end;

ご協力いただきありがとうございます。

編集:ここに写真:

ここに画像の説明を入力

編集:私のコード:

program Project2;

{$APPTYPE CONSOLE}

uses
 Kol,
 JpegObj;

var
 Jpeg: PJpeg;
 Bitmap: PBitmap;

begin
 Bitmap := NewBitmap(50, 50);
 try
  Bitmap.Canvas.Brush.Color := $0000FF80;
  Bitmap.Canvas.Ellipse(0, 0, 50, 50);
  Jpeg := NewJpeg;
  try
   Jpeg.Bitmap := Bitmap;
   Jpeg.SaveToFile('test.jpg');
  finally
   Jpeg.Free;
  end;
 finally
 Bitmap.Free;
end;

ランタイム エラー 216 at 0041128E

編集: JpegObj の行のコメントを外しました:

 {$DEFINE VER62} // if you plan to use .obj-files from Delphi7 distributive only!

現在、プログラムは凍結されています。

編集: JpegObj でプログラムがフリーズします

function __ftol: Integer;
 var
  f: double;
begin
 asm
  lea    eax, f             //  BC++ passes floats on the FPU stack
  fstp  qword ptr [eax]     //  Delphi passes floats on the CPU stack
 end;
 Result := Integer(Trunc(f));
end;
4

1 に答える 1

4

免責事項:以下はDelphi 2009でテストされています!

インスタンスでインスタンス化されていないため、また後でそのインスタンスで作業しているときにインスタンス化されていないため、インスタンスにアクセスしているときはnilであるため、インスタンスで使用することはできませんPJpeg.Bitmap.Assign。したがって、リードを操作しようとすると、アクセス違反が発生します。PJpegPJpeg.BitmapPJpegPJpeg.Bitmap

JpegObjこの方法でビットマップを割り当ててみてください(拡張機能の例に基づいています)。

var 
  MyJpeg: PJpeg;
  MyBitmap: PBitmap;
begin
  // the MyBitMap has a picture assigned here
  MyJpeg := NewJpeg;
  try
    MyJpeg.Bitmap := MyBitmap;
    MyJpeg.SaveToFile('c:\test.jpg');
  finally
    MyJpeg.Free;
  end;
end;

これがVCLのミニマルなデモです。

uses
  KOL, JPEGObj;

procedure TForm1.Button1Click(Sender: TObject);
var
  Jpeg: PJpeg;
  Bitmap: PBitmap;
begin
  Bitmap := NewBitmap(50, 50);
  try
    Bitmap.Canvas.Brush.Color := $0000FF80;
    Bitmap.Canvas.Ellipse(0, 0, 50, 50);
    Jpeg := NewJpeg;
    try
      Jpeg.Bitmap := Bitmap;
      Jpeg.SaveToFile('c:\image.jpg');
    finally
      Jpeg.Free;
    end;
  finally
    Bitmap.Free;
  end;
end;

そして驚くべき結果:-)

ここに画像の説明を入力してください

これは、別のコンソールのミニマルなデモです。

program Console;

{$APPTYPE CONSOLE}

uses
  SysUtils, KOL, JPEGObj;

var
  Jpeg: PJpeg;
  Bitmap: PBitmap;    
begin
  try
    Bitmap := NewBitmap(50, 50);
    try
      Bitmap.Canvas.Brush.Color := $0000CCFF;
      Bitmap.Canvas.Ellipse(0, 0, 50, 50);
      Jpeg := NewJpeg;
      try
        Jpeg.Bitmap := Bitmap;
        Jpeg.SaveToFile('c:\image.jpg');
      finally
        Jpeg.Free;
      end;
    finally
      Bitmap.Free;
    end;
  except
    on E:Exception do
      Writeln(E.Classname, ': ', E.Message);
  end;
end.

そしてエキサイティングな結果:-)

ここに画像の説明を入力してください

于 2012-05-19T00:43:15.310 に答える