请问如何把DELPHI TIMAGE控件中的图像传给VC写的DLL进行处理,然后把处理的结果返回给TImage控件并显示? 我的邮箱是[email protected],欢迎讨论,谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 看Dll的接口是什么,可以把图象的二进制数据流传给Dll. 我可以显示图片,但是总有一个异常,xxx地址不能写,查不到原因!谁有例子? 接口函数使用byte数组作为参数。 提供一个接口供VC访问TImage控件的Canvas.Handle属性,即HDC,这样就可以了! 道理跟调用WinAPI一样,比如: TextOut(hDC, 0, 0, 'Hello World!', 12); 问题:图片可以显示,但总是有异常窗口,图片和程序在附件中,我已经在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 > 1000class 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_FILEstatic char THIS_FILE[] = __FILE__;#endifCImage::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);} 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;interfaceuses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ExtCtrls;procedure showPic(hwnd:HWND;hDC:HDC;filenamechar); stdcall;implementationprocedure showPic;external 'ShowImg.DLL' name 'showPic';end.//主窗口部分unit Unit1;interfaceuses 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;implementationuses PIC;{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);begin showPic(self.Handle,image1.Canvas.Handle,pchar('1.bmp'));end;end. D7如何实现类似word2003的多窗口界面 ●对文件进程操作如何才能提高效率? 用Access做C/S,请高手指点迷津!!!!!!!!!!!!! IdHTTP1控件如何发送文件 关于进度条ProgressBar的使用 有关界面程序 结婚了!太高兴了!散分! 请教,MDIChildForm,在最大化后如何仍然显示本身的最大化、最小化、关闭按钮,而不是被MDIFrom的替代了?? 查询语句可以同时设定显示的列标题名称吗? DCU文件找不着怎么办 谁知道_llseek函数的用法 报表转成文本文件问题!
谁有例子?
TextOut(hDC, 0, 0, 'Hello World!', 12);
// 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 > 1000class 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__;
#endifCImage::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);
}
{
//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;interfaceuses
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;interfaceuses
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.