100分请教:C++代码转换成Delphi(视频处理)

gggxkj999 2008-03-28 02:31:55
ULONG m_ulSampleDone;
int m_ulRGBMax;
ULONG* pSamplePicture;
m_ulRGBMax = 0;
ULONG VideoLine,VideoCol;
ULONG VideoMode;


SFCG_GetVideoMode( VideoMode, m_uCardNum );
if( VideoMode )
{
VideoLine = 720;
VideoCol = 576;
}
else
{
VideoLine = 720;
VideoCol = 488;
}

m_str.Format(_T(" "));
m_StartEndTime_str.Format(_T(" "));
m_SpendTime_str.Format(_T(" "));

pSamplePicture = new ULONG[VideoLine*VideoCol]; //Sampled data
if( !SFCG_SetVideoSample(m_uCardNum) )
{
MessageBox( _T("Set video sample error!"),_T("Error") );
return;
}
while( !SFCG_GetIfVideoSampleDone( m_ulSampleDone, m_uCardNum ) );

SFCG_GetVideoSampleData( pSamplePicture, m_uCardNum );

CClientDC dc(this);

if (m_hBitmap)
::DeleteObject(m_hBitmap);

//成员变量 位图句柄,用于在视图重绘时
m_hBitmap = ::CreateCompatibleBitmap(dc.GetSafeHdc(),VideoLine,VideoCol);

if(!m_hBitmap) //生成句柄不成功
return;

CBitmap bmp;
bmp.Attach(m_hBitmap);
BITMAP bm;
unsigned int PixelBytes = 0;
unsigned int i;

bmp.GetBitmap(&bm);
BYTE* lpBits = NULL;
BYTE r,g,b;

switch(bm.bmBitsPixel)
{
case 16: // R:G:B = 5:6:5
PixelBytes = 2;
lpBits = new BYTE[bm.bmWidth*bm.bmHeight*PixelBytes];
for(i = 0;i<VideoCol*VideoLine;i++)
{
r = BYTE(pSamplePicture[i]>>16); //Get Red Component
g = BYTE(pSamplePicture[i]>>8); //Get Green Component
b = BYTE(pSamplePicture[i]); //Get Blue Component
lpBits[2*i] = (0xe0&(g<<3))|(b>>3);
lpBits[2*i+1] = (r&0xf8)|(g>>5);
}

break;
case 24:
PixelBytes = 3; // R:G:B = 8:8:8
lpBits = new BYTE[bm.bmWidth*bm.bmHeight*PixelBytes];
for(i = 0;i<VideoCol*VideoLine;i++)
{
r = BYTE(pSamplePicture[i]>>16); //Get Red Component
g = BYTE(pSamplePicture[i]>>8); //Get Green Component
b = BYTE(pSamplePicture[i]); //Get Blue Component
lpBits[3*i] = b;
lpBits[3*i+1] = g;
lpBits[3*i+2] = r;
}
break;
default:
break;
}

if(lpBits) // Not 32 bits true color
bmp.SetBitmapBits(bm.bmWidth*bm.bmHeight*PixelBytes,lpBits);
else // 32 bits true color
bmp.SetBitmapBits(VideoCol*VideoLine*4,pSamplePicture);

// Display sampled picture
CDC mem;
mem.CreateCompatibleDC(&dc);
CBitmap* pOld = mem.SelectObject(&bmp);
dc.BitBlt(0,0,VideoLine,VideoCol,&mem,0,0,SRCCOPY);
mem.SelectObject(pOld);
mem.DeleteDC();
bmp.Detach();

if(lpBits)delete lpBits;
delete pSamplePicture;
...全文
113 19 打赏 收藏 举报
写回复
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
UP,
好麻烦啊
gggxkj999 2008-04-10
  • 打赏
  • 举报
回复
问题搞定了,一直忘了帖上来与大家一起分享,处理得有一点笨,希望大家给点建议!


//获取视频的制式,VideoMode为1时,工作在PAL制,为0时,工作在NTSC制
SFCG_GetVideoMode(@VideoMode, m_uCardNum - 1);
if Boolean(VideoMode) then
begin
VideoLine := 720;
VideoCol := 576;
end
else
begin
VideoLine := 720;
VideoCol := 488;
end;

bmp := TBitmap.Create;
bmp.PixelFormat := pf24Bit;
bmp.width := VideoLine;
bmp.Height := VideoCol;

i := VideoLine * VideoCol;

GetMem(pSamplePicture, i * 4);

if not SFCG_SetVideoSample(m_uCardNum - 1) then //设置板卡进入采样状态
begin
Application.MessageBox('板卡图像采样错误!', '提示', MB_Ok + MB_ICONINFORMATION);
Exit;
end;

{SFCG_GetIfVideoSampleDone获取采样是否完成, true采样完成, false采样未完成
如果采样未完成,程序将始终在此循环直到采样完成}
while true do
begin
if SFCG_GetIfVideoSampleDone(@m_ulSampleDone, m_uCardNum - 1) then
Break;
end;

{SFCG_GetVideoSampleData得到采样数据,得到的是图像中每个像素点的ARGB格式的采样数据,
高位为A,依次是R,G,B
对PAL制信号,采样的有效行为576行,每行的有效点为720点}
SFCG_GetVideoSampleData(pSamplePicture, m_uCardNum - 1);

{读取每个像素点的RGB值,并按缓存中的排列依次排列在控件}
for j := 0 to i - 1 do
begin
R := Byte(((pULONG(DWORD(pSamplePicture) + j * 4)^) shr 16) and $FF);
G := Byte(((pULONG(DWORD(pSamplePicture) + j * 4)^) shr 8) and $FF);
B := Byte(pULONG(DWORD(pSamplePicture) + j * 4)^ and $FF);

if j <= 719 then
begin
Row := j;
Col := 0;
end
else
begin
Row := j mod 720;
Col := j div 720;
end;

bmp.Canvas.Pixels[Row, Col] := RGB(R, G, B);
Application.ProcessMessages;
end;

Image1.Picture.Bitmap.Assign(bmp);
Image1.Repaint;
Bmp.Free;
FreeMem(pSamplePicture, i * 4);
gggxkj999 2008-03-31
  • 打赏
  • 举报
回复
谢谢各位的大力支持,这个问题让我头都大了,C太菜了!
Skt32 2008-03-31
  • 打赏
  • 举报
回复
C++ 头文件转换为Delphi接口文件的工具:http://www.phpvip.cn/download/delphi/1123344000394.html
tengxiang05 2008-03-29
  • 打赏
  • 举报
回复
转到delphi吧

懂C的很少懂delphi

但懂Delphi的或多或少懂C的
gggxkj999 2008-03-29
  • 打赏
  • 举报
回复
TO houdongfeng
已经发到你的邮箱!
谢谢查收!
Kratos 2008-03-28
  • 打赏
  • 举报
回复
Delphi?这个!><
Supper_Jerry 2008-03-28
  • 打赏
  • 举报
回复
懂c的很多可是懂delphi的很少。你到delphi版问问吧。
一点c基础都没有的话,封装成动态库也有点困难。
gggxkj999 2008-03-28
  • 打赏
  • 举报
回复
我是做DELPHI的,要用到这个功能,只有C的DEMO没有DELPHI DEMO,我C一点不懂,DELPHI下也没有做过类试的,更不知道C如何封装,所以只有请教各位了。
闪破风浪 2008-03-28
  • 打赏
  • 举报
回复
C牛了
干嘛还学delphi
不够专一。。。。。。
tengxiang05 2008-03-28
  • 打赏
  • 举报
回复
你是在学delphi 还是用这个功能
如果是用这个功能,那还是做成 dll
delphi 可以调用的,没这个必要去转
Supper_Jerry 2008-03-28
  • 打赏
  • 举报
回复
支持做成动态库,Delphi可以直接调用的。
laolaoliu2002 2008-03-28
  • 打赏
  • 举报
回复
为啥要转呢,直接做成动态连接库调用就可以了,省得转来转去.
舉杯邀明月 2008-03-28
  • 打赏
  • 举报
回复
我只能是基本上看得懂Delphi,要写起来,有点难。
houdongfeng 2008-03-28
  • 打赏
  • 举报
回复
houdongfeng@163.com
houdongfeng 2008-03-28
  • 打赏
  • 举报
回复
你给一个可以调试的C代码
我帮你弄
ryfdizuo 2008-03-28
  • 打赏
  • 举报
回复
根本不了解Delphi,看是可以看懂的,要是写,
转Delphi版吧,
gggxkj999 2008-03-28
  • 打赏
  • 举报
回复
请各位大侠帮帮忙!
ryfdizuo 2008-03-28
  • 打赏
  • 举报
回复
这个啊,太.
发帖
C++ 语言

6.3w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
帖子事件
创建了帖子
2008-03-28 02:31
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下