我正在使用带有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;0041128E处的运行时错误216
编辑:我在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;发布于 2012-05-19 08:43:15
免责声明:以下内容已在Delphi2009!上进行了测试
您不能在PJpeg实例上使用PJpeg.Bitmap.Assign,因为在您访问它的时候,PJpeg.Bitmap是空的,因为它不是在PJpeg构造函数中实例化的,在您使用该实例时也没有实例化。因此,尝试使用PJpeg.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.令人兴奋的结果是:-)

https://stackoverflow.com/questions/10661203
复制相似问题