利用Delphi为Visual C++添加JPEG图形处理功能(重贴)

[入库:2005年8月18日] [更新:2007年3月25日]

本文简介:选择自 yuhao 的 blog

利用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);
  }
}

本文关键:Delphi,Visual C++,图形
 

本站最佳浏览方式为 分辨率 1024x768 IE 6.0(或更高版本的 IE浏览器)

go top