利用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: est.jpg"))
   (*pDrawJPEGImage)(dc.m_hDC,0,0,pJPEG);
  (*pFreeJPEGImage)(pJPEG);
 }
}

时间: 2024-11-18 10:07:06

利用Delphi为Visual C++添加JPEG图形处理功能的相关文章

利用delphi完全控制桌面的实现

在windows 中系统桌面和开始菜单可以说是它的一大特色,其实我们可以利用delphi轻易地在应用程序中实现这种技术 : 新建一个应用程序, 将form1窗体的borderstyle属性设置为bsnone,formstyle属性设置为 fsstayontop,windowstate属性设置为wsmaximized. 如有必要可在form1窗体中放置一个image控件image1,为它的picture属性装入一幅自己喜爱的图像并将它的align属性设置为alclient,stretch设置为tr

利用Delphi开发网络数据库应用

Delphi 是具可视化界面的面向对象编程语言,它以其功能强大.简便易用等诸多特性,深受编程人员的欢迎.Delphi 中提供了数据库引擎 BDE(Borland Database Engine),并内含众多的数据库调用构件,为编程人员开发客户/服务器应用程序提供了方便.通常情况下,利用 Delphi 开发数据库应用程序,可以使用TTable.TDataSource.TDBEdit.TDBNavigator等构件.只要正确设置了构件的某些属性,再编写必要的程序代码对一些特定事件进行处理,就能够完成

利用Delphi实现系统状态栏图标

利用Delphi实现系统状态栏图标   下面以一个具体的例子,详细介绍一下利用Delphi实现系统状态栏图标的步骤和方法. 1.创建一个应用程序,在主窗体上增加一个TpopupMenu组件.并为该弹出选单组件增加选单项Exit,标题为"退出". 2.在Uses中添加ShellAPI,因为在系统状态栏中增加图标时需调用ShellAPI中的函数 Shell_NotifyIconA.该函数需要两个参数,其中一个是TnotifyIconDataA结构,需在主窗体中增加TnotifyIconDa

利用Delphi实现支持窗体的自定义函数

在利用Delphi发开应用时,我们可以引用大量的控件,象VCL,OCX,也可以引用开发环境中提供的大量函数,如ShowMessage,Application.MessageBox等,正是这些资源极大的提高了应用的开发效率,但是,在具体的开发过程中,会产生这样一种需求, 即如何将参数传递给窗体,最终用户操作窗体后返回具体值,应用程序再要根据此返回值作进一步的处理,就象Application.MessageBox一样工作.对此,笔者经过实践,终于通过自定义函数的形式找到了实现方法.下面让我们以实现类

利用PS动作为人像添加光照效果

  利用PS动作为人像添加光照效果           什么是PS动作? PS动作是Adobe Photoshop中包含执行指令的文件.执行PS动作可以按照既定指令,对图像自动进行操作.动作中通常包含两种以上预设效果,并且预设同时运行,往往指引性的输入提示.教程笔者认为,使用PS动作是图像编辑流程中的重要组成部分,并且可以为我们节省很多时间.虽然很多PS动作貌似可以"一键完成",但很重要的一点是,对处理图像要有一套自己的计划.PS动作只是工作流程中的一环,并非全部. PS动作一:柔焦1

利用delphi录入数据时代码错误问题

问题描述 利用delphi录入数据时代码错误问题 procedure TFrm_stu_ins.Button1Click(Sender: TObject); begin //写入数据 if (Trim(edt_name.Text)<>'') and (Trim(edt_numb.Text)<>'' ) and (Trim(edt_id.Text)<>'') then begin dm.q_stu_ins_ins.close; dm.q_stu_ins_ins.SQL.C

Visual.ly改版上线 添加社交新功能

近日,http://www.aliyun.com/zixun/aggregation/12238.html">数据可视化网站Visual.ly日前完成改版后重新上线,其添加的社交功能能让用户分享和关注他们最喜欢的主题.用户和设计者. Visual.ly的改版给网站带来了更多的社区元素,能够巩固现有的用户群,并帮助促进工作,其最大的价值主张是将有才能的设计者与那些信息图表公司联合起来协同工作,当然,该网站的发现和促销方面也很重要,但是Visual.ly无疑正在推广品牌连接.Visual.ly

Visual Studio 2013 RC1新功能

尽管微软仍未宣布Visual Studio 2013最终版本的发布日期,但是MSDN和TechNet订户们已经在今天早些时候拿到了期待已久的Windows 8.1 RTM.不过,微软也没有忘记VS 2013,并且随着Win 8.1 RTM一道,正式推出了Visual Studio 2013的候选发布版本.但据报道,该RC版本其实几天前就已经被泄露到互联网上了. 在Visual Studio博客上,微软开发部门总裁Somasegar写到:RC中迎来了Cloud Business App模板,将使得

向Windows Azure移动服务添加基本RBAC功能

去年 11 月,我们发布了 Azure Active Directory (AAD) 预览版作为移动服务身份提供程序.此举旨在为企业开发人员提供简单易用的解决方案,以构建面向员工的移动应用程序.作为起点,使用基本身份验证是一个很好的选择.但在很多情况下,目前的预览版客户需要对各种类型的用户加以区分,以便做出适当的授权决定.基于角色的访问控制 (RBAC) 的思路是为用户可以担任的角色分配权限,从而恰当定义界限来限定某类用户可以执行和不可执行的操作.幸运的是,向 Azure 移动服务添加基本 RB