利用delphi为visual c++添加jpeg图形处理功能
visual c++对jpeg等常见图形格式的支持不够一直是为人所诟病的缺陷,相比起来,delphi/c++ builder在这方面就要强得多了。由于jpeg是实际应用中经常使用的图形格式,如果你是visual c++用户的话,自然会想如何让visual c++能够处理jpeg图形。虽然网络上现在已经有了不少能够处理jpeg图形的visual c++库,但是别人的东西用起来总有点不那么得心应手,而且经常有一些限制,比如有名的imageobject库要求必须静态链接到mfc dll,给使用带来很多不便;如果是activex控制的话,又不得不考虑如何注册等麻烦的问题。实际上,借助于delphi对jpeg图形的强大处理功能,自己写一段小小的代码,就能够在几分钟内让visual c++也用上jpeg,diy的感觉就是不同!
要用本文介绍的代码,你手头应该有一套delphi(3.0以上的版本)和一套visual c++(5.0以上版本)。由于本文的代码非常简单,因此下面的代码不作注释,相信对这两套语言稍有基础的朋友都不难理解。
在delphi中新建一个dll工程imagelib,并添加一个mainfn.pas单元。文件清单如下:
////////////////////////////////////
// imagelib.dpr项目内容
////////////////////////////////////
library imagelib;
uses
sysutils,
classes,
mainfn in 'mainfn.pas';
exports
?createjpegimage,
?loadjpegimage,
?freejpegimage,
?drawjpegimage;
begin
end.
///////////////////////////////////////////////
// mainfn.pas单元内容
///////////////////////////////////////////////
unit mainfn;
interface
uses
sysutils, classes, windows, graphics, jpeg;
function createjpegimage:tjpegimage;stdcall;export;
function loadjpegimage(image:tjpegimage;szfilename:pchar):longbool;stdcall;export;
procedure freejpegimage(image:tjpegimage);stdcall;export;
procedure drawjpegimage(hdc:hdc;x,y:integer;image:tjpegimage);stdcall;export;
implementation
function createjpegimage:tjpegimage;
var
image : tjpegimage;
begin
try
image := tjpegimage.create;
result := image;
except
result := nil;
end;
end;
function loadjpegimage(image:tjpegimage;szfilename:pchar):longbool;
var
strfilename : string;
begin
try
strfilename := strpas(szfilename);
image.loadfromfile(strfilename);
result := true;
except
result := false;
end;
end;
procedure freejpegimage(image:tjpegimage);
begin
image.free;
end;
procedure drawjpegimage(hdc:hdc;x,y:integer;image:tjpegimage);
var
canvas : tcanvas;
begin
canvas := tcanvas.create;
canvas.handle := hdc;
canvas.draw(x,y,image);
canvas.free;
end;
end.
项目编译完成后生成的dll就可以直接在visual c++中使用了。以下是用visual c++生成的测试项目内容,使用dialog based框架:
typedef void* pjpeg;
/*
function createjpegimage:tjpegimage;stdcall;export;
function loadjpegimage(image:tjpegimage;szfilename:pchar):longbool;
procedure freejpegimage(image:tjpegimage);stdcall;export;
procedure drawjpegimage(hdc:hdc;x,y:integer;image:tjpegimage);stdcall;export;
*/
typedef pjpeg (__stdcall* createjpegimage)();
typedef bool (__stdcall* loadjpegimage)(pjpeg,lpcstr);
typedef void (__stdcall* freejpegimage)(pjpeg);
typedef void (__stdcall* drawjpegimage)(hdc,int,int,pjpeg);
class ctdlg : public cdialog
{
...
public:
hinstnace m_hlib;
createjpegimage pcreatejpegimage;
loadjpegimage ploadjpegimage;
freejpegimage pfreejpegimage;
drawjpegimage pdrawjpegimage;
}
bool ctdlg::oninitdialog()
{
...
m_hlib = loadlibrary("imagelib.dll");
pcreatejpegimage = (createjpegimage)getprocaddress(m_hlib,"createjpegimage");
ploadjpegimage = (loadjpegimage)getprocaddress(m_hlib,"loadjpegimage");
pfreejpegimage = (freejpegimage)getprocaddress(m_hlib,"freejpegimage");
pdrawjpegimage = (drawjpegimage)getprocaddress(m_hlib,"drawjpegimage");
}
void ctdlg::ondestroy()
{
if (m_hlib)
freelibrary(m_hlib);
}
void ctdlg::onpaint()
{
cpaintdc dc(this);
pjpeg pjpeg;
pjpeg = (*pcreatejpegimage)();
if (pjpeg)
{
if ((*ploadjpegimage)(pjpeg,"c:\\test.jpg"))
(*pdrawjpegimage)(dc.m_hdc,0,0,pjpeg);
(*pfreejpegimage)(pjpeg);
}
}