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

原创 2001年05月06日 11:54:00

利用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++添加JPEG图形处理功能

  • zgqtxwd
  • zgqtxwd
  • 2008年04月30日 21:58
  • 140

使用 Visual Assist–VS助手 快速添加注释

1:打开VA 的Options,选择 Advanced-> Suggestions->Edit VA Snippets   2:然后在C++下new一个com,然后填写Title,Shutcut,...
  • xie1xiao1jun
  • xie1xiao1jun
  • 2013年05月07日 11:05
  • 1758

利用jpeglib压缩图像为jpg格式

前一段时间做了一个项目,项目中有一部分是关于图像采集的,相关硬件有:高速数字相机(我们采用Basler A312f),工控机,服务器。其中相机通过1394视频线连接到工控机的1394视频卡上,工控机与...
  • zhao3728
  • zhao3728
  • 2007年08月22日 18:07
  • 9318

JPEG图像压缩解压算法——C++实现

兹于2017年11月,应《多媒体技术基础》课程实验的要求,本人就基于JPEG图像压缩解压算法做了较为深入的理解,用C++语言实现JPEG图像压缩解压算法。 JPEG图像压缩解压算法 ...
  • tb20677206
  • tb20677206
  • 2017年12月03日 01:24
  • 667

visual studio 自动添加函数说明。

http://stackoverflow.com/questions/8256996/how-do-i-add-parameter-comments-for-a-method-in-c-sharp ...
  • u014683488
  • u014683488
  • 2016年08月05日 22:03
  • 407

在DELPHI中SQL存取JPEG方法 (转)

D7自带的DBIMAGE只支持BMP文件,要实现JPG才行,不然数据库太大。 / /SQL存储JPEG方法(以D7自带的image控件进行存取,注意此时窗体上不要使用任何dbimage控件,不然总是...
  • onebigday
  • onebigday
  • 2010年03月29日 21:11
  • 2887

Delphi 完全时尚手册之 Visual Style 篇

     这里先说说两个概念:Theme(主题)和 Visual Style 。Theme 最早出现在 Microsoft Plus! for Windows 95 中,是 Windows 中 Wal...
  • iseekcode
  • iseekcode
  • 2009年10月27日 13:50
  • 920

在 Visual C++ 中开发自定义的绘图控件(一)

主宰绘图操作 即使“只”进行绘制,您仍然有至少四种选项可用,它们都具有鲜明的优缺点: 处理 WM_PAINT 所有者绘制 自定义绘制 处理 WM_CTLCOLOR ...
  • whlong4221
  • whlong4221
  • 2012年03月03日 16:04
  • 907

如何在Visual C++ 6.0中添加多行注释图标和多行注释快捷键?

如何在Visual C++ 6.0中添加多行注释图标和多行注释快捷键? 1.添加多行注释图标: (1) 点击工具栏的Tools—>Customize—>Add-ins and Macro File...
  • yuanziwoxin
  • yuanziwoxin
  • 2017年01月13日 21:55
  • 1345

设计工具大比拼之Visual C++ VS Delphi

 引言   "Visual C++与Delphi之比较"最近在CSDN的论坛上的讨论非常火热,本文将以一个程序员的角度,从技术水平、功能、性能、易用性、稳定性、发展历程和前景等方面,以Visual C...
  • micel108
  • micel108
  • 2007年02月14日 14:43
  • 870
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:利用Delphi为Visual C++添加JPEG图形处理功能(重贴)
举报原因:
原因补充:

(最多只允许输入30个字)