社区
GAME,图形处理/多媒体
帖子详情
请问如何把DELPHI TIMAGE控件中的图像传给VC写的DLL进行处理,然后把处理的结果返回给TImage控件并显示?
airhand
2005-02-28 08:28:40
我的邮箱是AIRHAND@163.COM,欢迎讨论,谢谢!
...全文
247
12
打赏
收藏
请问如何把DELPHI TIMAGE控件中的图像传给VC写的DLL进行处理,然后把处理的结果返回给TImage控件并显示?
我的邮箱是AIRHAND@163.COM,欢迎讨论,谢谢!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
打赏
举报
回复
挺有難度
程序小童的爸爸
2005-03-01
打赏
举报
回复
给vc图片控件的句柄就可以了。
sxy_9761
2005-03-01
打赏
举报
回复
提供HDC
neo40
2005-03-01
打赏
举报
回复
用API吧
delphi
控件
使用
Standard页 1- Tlistbox
控件
重要属性items.* 举例,界面设计如下左,执行结果如下右: 代码为 procedure TForm1.Button1Click(Sender: TObject); begin edit1.Text := listbox1.Items.CommaText; edit2.Text := listbo...
delphi
dll
(2)
dll
封装资源
本篇文章参考 咏南工作室 使用
dll
来封装程序资源。首先说明一下资源文件的使用:1.初级篇 资源文件一般为扩展名为res的文件,在
VC
中
资源文件用得非常普遍,但
Delphi
在其联机帮助
中
对资源文件没作什么介绍。其实利用其自带的资源编译工具BRCC32.EXE(一般位于
Delphi
BIN目录下),我们完全可以做出跟
VC
一样效果的文件来。 资源文件最大的好处是能将一些在必要时才调用的文
谈
Delphi
编程
中
资源文件的应用
一、初级应用篇 资源文件一般为扩展名为res的文件,在
VC
中
资源文件用得非常普遍,但
Delphi
在其联机帮助
中
对资源文件没 作什么介绍。其实利用其自带的资源编译工具BRCC32.EXE(一般位于
Delphi
BIN目录下),我们完全可以做出跟
VC
一 样效果的文件来。 资源文件最大的好处是能将一些在必要时才调用的文件跟可执行文件一起编译,生成一个文件。这样做最大 的好处就
怎样把图片资源导入
Dll
,并且取出来? (转)
谈
Delphi
编程
中
资源文件的应用 陈经韬(一)初级应用篇: 资源文件一般为扩展名为res的文...
delphi
异形窗体
DELPHI
透明窗体 心血来潮想用
delphi
做透明窗体,要知道我虽然搞了N年编程,但什么也没编
写
成。惭愧的很,以前
VC
VB之类的光搞懂它们的
控件
就让我很费劲,没办法不懂英文。还是学
DELPHI
吧,听说是聪明程序员学习的语言。在网络上搜索下透明窗体,哈文章不少,视频也有,但都太繁琐,关键看不懂,总算有个简单的,实验成功了哈哈。博下来以后用: unit StyleForm...
GAME,图形处理/多媒体
1,183
社区成员
14,336
社区内容
发帖
与我相关
我的任务
GAME,图形处理/多媒体
Delphi GAME,图形处理/多媒体
复制链接
扫一扫
分享
社区描述
Delphi GAME,图形处理/多媒体
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章