请问如何把DELPHI TIMAGE控件中的图像传给VC写的DLL进行处理,然后把处理的结果返回给TImage控件并显示?

airhand 2005-02-28 08:28:40
我的邮箱是AIRHAND@163.COM,欢迎讨论,谢谢!
...全文
247 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
caiso 2005-03-04
  • 打赏
  • 举报
回复
顶一下
airhand 2005-03-02
  • 打赏
  • 举报
回复
unsigned CImage::GetGrayData(int x, int y)
{
//x,y ---- The one-based index,i.e. the nature index.
//x ---- Column
//y ---- Row
unsigned Gray;
LPBITMAPINFOHEADER pInfo = (BITMAPINFOHEADER *)m_pBitsInfo;
if((x<=0)||(x>pInfo->biWidth)||\
(y<=0)||(y>pInfo->biHeight) )
{
return 0;
}
y = pInfo->biHeight - y + 1;
Gray = unsigned(*(m_pImageData + (y-1)*m_BytesPerLine + (x-1)));
return Gray;
}
int CImage::GetDispHeight()
{
LPBITMAPINFOHEADER pInfo = (BITMAPINFOHEADER *)m_pBitsInfo;
return int(pInfo->biHeight);
}
int CImage::GetDispWidth()
{
LPBITMAPINFOHEADER pInfo = (BITMAPINFOHEADER *)m_pBitsInfo;
return int(pInfo->biWidth);
}
CImage& CImage:perator=(CImage &img)
{
Empty();
m_iFileLength = img.m_iFileLength;
m_iPaletteEntry = img.m_iPaletteEntry;
m_BytesPerLine = img.m_BytesPerLine;
unsigned long lLength = m_iFileLength - sizeof(BITMAPFILEHEADER);
m_pBFI = (BITMAPFILEHEADER *)new BYTE[sizeof(BITMAPFILEHEADER)];
CopyMemory(m_pBFI,img.m_pBFI,14L);
m_pBitsInfo = new BYTE[lLength];
ZeroMemory(m_pBitsInfo, lLength);
CopyMemory(m_pBitsInfo, img.m_pBitsInfo, lLength);

m_pImageData = &m_pBitsInfo[sizeof(BITMAPINFOHEADER) + m_iPaletteEntry*sizeof(RGBQUAD)];
return *this;
}
BOOL CImage:aveImage(LPCTSTR filename)
{
CFile file;
if(!(file.Open(filename,CFile::modeCreate|CFile::modeWrite)))
{
return FALSE;
}
file.Seek(0L,CFile::begin);
file.Write(m_pBFI,sizeof(BITMAPFILEHEADER));
file.WriteHuge(m_pBitsInfo,m_iFileLength - sizeof(BITMAPFILEHEADER));
file.Close();

return TRUE;
}






DLL部分如下:
//showPic.cpp
//////////////////////////////////////////////////////////////////////

#include "ShowPic.h"
#include "stdafx.h"
#include "ShowImg.h"
#include "Image.h"

CImage img;

extern "C" __declspec(dllexport) void showPic(HWND hwnd,HDC hDC,char* filename)
{
CDC * pDC=CDC::FromHandle(hDC);
img.LoadImage((LPCTSTR)filename);
img.Display(0,0,pDC);
ReleaseDC(hwnd,hDC);
//pDC=NULL;

}


//showPic.h
//////////////////////////////////////////////////////////////////////
extern "C" __declspec(dllexport) void showPic(HWND hwnd,HDC hDC,char* filename);


DELPHI DLL调用申明部分:
//
//PIC.PAS
///////////////////////////////////////////////
unit PIC;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

procedure showPic(hwnd:HWND;hDC:HDC;filenamechar); stdcall;

implementation
procedure showPic;external 'ShowImg.DLL' name 'showPic';

end.


//主窗口部分
unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

type
TForm1 = class(TForm)
Image1: TImage;
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation
uses PIC;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
showPic(self.Handle,image1.Canvas.Handle,pchar('1.bmp'));
end;

end.
airhand 2005-03-02
  • 打赏
  • 举报
回复
问题:图片可以显示,但总是有异常窗口,图片和程序在附件中,我已经在VC中调试了,但是找不到问题点,请问如何解决,谢谢!

我想用VC的DLL控制DELPHI image控件的显示,代码如下:
// Image.h: interface for the CImage class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_IMAGE_H__E319F2F9_2FCA_4A60_AADC_36C399F4D6E9__INCLUDED_)
#define AFX_IMAGE_H__E319F2F9_2FCA_4A60_AADC_36C399F4D6E9__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

class CImage
{
private:
BYTE* m_pBitsInfo;
LPBITMAPFILEHEADER m_pBFI;
unsigned long m_iFileLength;
unsigned long m_BytesPerLine;
public:
int m_iPaletteEntry;
BYTE* m_pImageData;
public:
BOOL SaveImage(LPCTSTR filename);
CImage& operator=(CImage &img);
int GetDispWidth();
int GetDispHeight();
unsigned GetGrayData(int x, int y);
COLORREF GetColorData(int x, int y);
void Empty();
void Display(int x,int y,int cx,int cy,CDC* pDC);
void Display(int x,int y,CDC *pDC);
BOOL LoadImage(LPCTSTR filename);
CImage();
~CImage();
};


#endif // !defined(AFX_IMAGE_H__E319F2F9_2FCA_4A60_AADC_36C399F4D6E9__INCLUDED_)


// Image.cpp: implementation of the CImage class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "Image.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

CImage::CImage()
{
m_pBFI = NULL;
m_pImageData = NULL;
m_pBitsInfo = NULL;

}
CImage::~CImage()
{
if(m_pBitsInfo)
delete[] m_pBitsInfo;
if(m_pBFI)
delete m_pBFI;
m_pBFI = NULL;
m_pImageData = NULL;
m_pBitsInfo = NULL;
}
BOOL CImage::LoadImage(LPCTSTR filename)
{
Empty();
CFile file;
BOOL result = file.Open(filename,CFile::modeRead,NULL);
if(!result)
{
return result;
}

file.Seek(0L,CFile::begin);
m_iFileLength = file.GetLength();
m_pBFI = (BITMAPFILEHEADER *)new BYTE[sizeof(BITMAPFILEHEADER)];
if( file.Read(m_pBFI,sizeof(BITMAPFILEHEADER)) != sizeof(BITMAPFILEHEADER))

{
return FALSE;
}
if( m_pBFI->bfType != 'MB')
{
return FALSE;
}
unsigned long lLength = m_iFileLength - sizeof(BITMAPFILEHEADER);
m_pBitsInfo = new BYTE[lLength];
if(file.ReadHuge(m_pBitsInfo,lLength) != lLength)
{
return FALSE;
}

LPBITMAPINFOHEADER pInfo = (BITMAPINFOHEADER *)m_pBitsInfo;
switch(pInfo->biBitCount)
{
case 8:
m_iPaletteEntry = 256;
break;
case 24:
m_iPaletteEntry = 0;
break;
default:
::AfxMessageBox("This is not an 8-bit or 24-bit bitmap!\n");
return FALSE;
}

m_BytesPerLine=pInfo->biWidth*(pInfo->biBitCount/8);
if(m_BytesPerLine%4!=0)
{
m_BytesPerLine=(m_BytesPerLine/4+1)*4;
}

m_pImageData = &m_pBitsInfo[sizeof(BITMAPINFOHEADER) + m_iPaletteEntry*sizeof(RGBQUAD)];
file.Close();
return TRUE;
}
void CImage:isplay(int x, int y, CDC *pDC)
{
:tretchDIBits(pDC->GetSafeHdc(),\
x,y,\
((BITMAPINFOHEADER*)m_pBitsInfo)->biWidth,((BITMAPINFOHEADER*)m_pBitsInfo)->biHeight,\
0,0,\
((BITMAPINFOHEADER*)m_pBitsInfo)->biWidth,((BITMAPINFOHEADER*)m_pBitsInfo)->biHeight,\
m_pImageData,(BITMAPINFO *)m_pBitsInfo,\
DIB_RGB_COLORS,SRCCOPY);
}
void CImage:isplay(int x, int y, int cx, int cy, CDC *pDC)
{

:tretchDIBits(pDC->GetSafeHdc(),\
x,y,\
cx,cy,\
0,0,\
((BITMAPINFOHEADER*)m_pBitsInfo)->biWidth-100,((BITMAPINFOHEADER*)m_pBitsInfo)->biHeight,\
m_pImageData,(LPBITMAPINFO)m_pBitsInfo,\
DIB_RGB_COLORS,SRCCOPY);
}
void CImage::Empty()
{
if(m_pBitsInfo)
delete[] m_pBitsInfo;
if(m_pBFI)
delete m_pBFI;
m_pBFI = NULL;
m_pImageData = NULL;
m_pBitsInfo = NULL;
}

COLORREF CImage::GetColorData(int x, int y)
{
//x,y ---- The one-based index,i.e. the nature index.
//x ---- Column
//y ---- Row
unsigned long temp;
unsigned r,g,b;
LPBITMAPINFOHEADER pInfo = (BITMAPINFOHEADER *)m_pBitsInfo;
if((x<=0)||(x>pInfo->biWidth)||\
(y<=0)||(y>pInfo->biHeight) )
{
return RGB(0,0,0);
}
y = pInfo->biHeight - y + 1;
temp = (y-1)*m_BytesPerLine + (x-1)*3;
r = *(m_pImageData + temp);
g = *(m_pImageData + temp + 1);
b = *(m_pImageData + temp + 2);
return RGB(r,g,b);
}

00131lyf 2005-03-01
  • 打赏
  • 举报
回复
道理跟调用WinAPI一样,比如:
TextOut(hDC, 0, 0, 'Hello World!', 12);
00131lyf 2005-03-01
  • 打赏
  • 举报
回复
提供一个接口供VC访问TImage控件的Canvas.Handle属性,即HDC,这样就可以了!
flyforlove 2005-03-01
  • 打赏
  • 举报
回复
接口函数使用byte数组作为参数。
airhand 2005-03-01
  • 打赏
  • 举报
回复
我可以显示图片,但是总有一个异常,xxx地址不能写,查不到原因!
谁有例子?
gzmhero 2005-03-01
  • 打赏
  • 举报
回复
看Dll的接口是什么,可以把图象的二进制数据流传给Dll.
Allblus 2005-03-01
  • 打赏
  • 举报
回复
挺有難度
  • 打赏
  • 举报
回复
给vc图片控件的句柄就可以了。
sxy_9761 2005-03-01
  • 打赏
  • 举报
回复
提供HDC
neo40 2005-03-01
  • 打赏
  • 举报
回复
用API吧

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi GAME,图形处理/多媒体
社区管理员
  • GAME,图形处理/多媒体社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧