新添加SV4000E视频卡。

This commit is contained in:
TAO Cheng
2013-06-26 17:01:39 +08:00
parent 42491190fb
commit b26d5826ee
13 changed files with 1633 additions and 4 deletions
@@ -1462,3 +1462,22 @@ Init:Open device succeed .
_start_machine
Exit: Exit_SO7Usb
Destruct Cso7_Proto.
Construct Cso7_Proto.
Init:Open device succeed .
_start_machine
Exit: Exit_SO7Usb
Destruct Cso7_Proto.
Construct Cso7_Proto.
Init:Open device succeed .
_start_machine
Exit: Exit_SO7Usb
Destruct Cso7_Proto.
@@ -721,6 +721,25 @@ BEGIN
LTEXT "Standard",IDC_STATIC,523,68,30,8
END
IDD_SO7_VIDEOCARD_SV4000E DIALOGEX 0, 0, 488, 316
STYLE DS_SETFONT | DS_MODALFRAME | DS_FIXEDSYS | WS_POPUP | WS_CAPTION | WS_SYSMENU
CAPTION "SV4000E视频卡"
FONT 8, "MS Shell Dlg", 400, 0, 0x1
BEGIN
DEFPUSHBUTTON "开始",IDOK,372,298,50,14
PUSHBUTTON "退出",IDCANCEL,435,298,50,14
CONTROL "彩色图像",IDC_RADIO_SV4000E_RGB,"Button",BS_AUTORADIOBUTTON | WS_GROUP,435,49,48,10
CONTROL "黑白图像",IDC_RADIO_SV4000E_GRAY,"Button",BS_AUTORADIOBUTTON,435,67,48,10
CONTROL "垂直镜像",IDC_SV4000E_CHECK_MIRROR_VERTICALLY,"Button",BS_AUTOCHECKBOX | WS_TABSTOP,435,93,48,10
PUSHBUTTON "保存图片",IDC_BUTTON_SV4000E_SAVEFILE,435,117,50,14
GROUPBOX "通道选择",IDC_STATIC,438,145,43,87
CONTROL "",IDC_STATIC_SV4000E_PICTURE,"Static",SS_BLACKFRAME | NOT WS_VISIBLE,225,300,71,12
CONTROL "1",IDC_RADIO_SV4000E_CHANNEL1,"Button",BS_AUTORADIOBUTTON | WS_GROUP,451,162,20,10
CONTROL "2",IDC_RADIO_SV4000E_CHANNEL2,"Button",BS_AUTORADIOBUTTON,451,179,20,10
CONTROL "3",IDC_RADIO_SV4000E_CHANNEL3,"Button",BS_AUTORADIOBUTTON,451,196,20,10
CONTROL "4",IDC_RADIO_SV4000E_CHANNEL4,"Button",BS_AUTORADIOBUTTON,451,213,20,10
END
/////////////////////////////////////////////////////////////////////////////
//
@@ -827,6 +846,15 @@ BEGIN
TOPMARGIN, 7
BOTTOMMARGIN, 247
END
IDD_SO7_VIDEOCARD_SV4000E, DIALOG
BEGIN
LEFTMARGIN, 7
RIGHTMARGIN, 485
VERTGUIDE, 435
TOPMARGIN, 7
BOTTOMMARGIN, 312
END
END
#endif // APSTUDIO_INVOKED
@@ -19,6 +19,8 @@
#include "Videocard_SV2000E.h"
#include "..\..\..\Videocard\TC4000\Sa7134Capture.h"
#include "Videocard_TC4000.h"
#include "..\..\..\Videocard\SV4000E\SV4000E.h"
#include "Videocard_SV4000E.h"
#endif //_RELEASE_FULL_VERSION
#include "SO7_UtilDlg.h"
@@ -221,6 +223,14 @@ void CSo7_Option::OnBnClickedOk()
delete pVideocard_SV2000E;
#endif //_RELEASE_FULL_VERSION
}
else if (((CButton *)GetDlgItem(IDC_RADIO_VIDEOCARD_SV4000E))->GetCheck())
{
#ifdef _RELEASE_FULL_VERSION
CVideocard_SV4000E* pVideocard_SV4000E=new CVideocard_SV4000E();
pVideocard_SV4000E->DoModal();
delete pVideocard_SV4000E;
#endif //_RELEASE_FULL_VERSION
}
else if (((CButton *)GetDlgItem(IDC_RADIO_VIDEOCARD_TC4000))->GetCheck())
{
#ifdef _RELEASE_FULL_VERSION
@@ -43,7 +43,7 @@
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
<ConfigurationType>Application</ConfigurationType>
<UseOfMfc>Dynamic</UseOfMfc>
<UseOfMfc>Static</UseOfMfc>
<CharacterSet>Unicode</CharacterSet>
<WholeProgramOptimization>true</WholeProgramOptimization>
</PropertyGroup>
@@ -142,7 +142,7 @@
<AdditionalIncludeDirectories>$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
</ResourceCompile>
<Link>
<AdditionalDependencies>..\..\..\..\..\..\..\ThirdParty\UsbSupport\LibUsb_Win\Lib\Msvc\libusb.lib;..\..\..\Videocard\SDK3000\sdk3000_7130.lib;..\..\..\Videocard\SV2000E\dataAcq.lib;..\..\..\Videocard\SV2000E\DXMediaCap.lib;..\..\..\Videocard\TC4000\Sa7134Capture.lib;%(AdditionalDependencies)</AdditionalDependencies>
<AdditionalDependencies>..\..\..\..\..\..\..\ThirdParty\UsbSupport\LibUsb_Win\Lib\Msvc\libusb.lib;..\..\..\Videocard\SDK3000\sdk3000_7130.lib;..\..\..\Videocard\TC4000\Sa7134Capture.lib;..\..\..\Videocard\SV4000E\dataAcq.lib;..\..\..\Videocard\SV4000E\DXMediaCap.lib;%(AdditionalDependencies)</AdditionalDependencies>
<GenerateDebugInformation>true</GenerateDebugInformation>
<SubSystem>Windows</SubSystem>
<TargetMachine>MachineX86</TargetMachine>
@@ -185,7 +185,7 @@
<IntrinsicFunctions>true</IntrinsicFunctions>
<PreprocessorDefinitions>WIN32;_WINDOWS;NDEBUG;_CRT_SECURE_NO_WARNINGS;_RELEASE_FULL_VERSION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<MinimalRebuild>false</MinimalRebuild>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking>
<PrecompiledHeader>Use</PrecompiledHeader>
<WarningLevel>Level4</WarningLevel>
@@ -351,6 +351,7 @@
</ClCompile>
<ClCompile Include="Videocard_SDK3000.cpp" />
<ClCompile Include="Videocard_SV2000E.cpp" />
<ClCompile Include="Videocard_SV4000E.cpp" />
<ClCompile Include="Videocard_TC4000.cpp" />
</ItemGroup>
<ItemGroup>
@@ -407,6 +408,7 @@
<ClInclude Include="VideoCardDefine.h" />
<ClInclude Include="Videocard_SDK3000.h" />
<ClInclude Include="Videocard_SV2000E.h" />
<ClInclude Include="Videocard_SV4000E.h" />
<ClInclude Include="Videocard_TC4000.h" />
</ItemGroup>
<ItemGroup>
@@ -133,6 +133,9 @@
<ClCompile Include="AboutDlg.cpp">
<Filter>Sources Files</Filter>
</ClCompile>
<ClCompile Include="Videocard_SV4000E.cpp">
<Filter>Sources Files</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="CaptureDataDlg.h">
@@ -297,6 +300,9 @@
<ClInclude Include="AboutDlg.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="Videocard_SV4000E.h">
<Filter>Header Files</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<None Include="ReadMe.txt" />
@@ -0,0 +1,558 @@
// Videocard_SV4000E.cpp : implementation file
//
#include "stdafx.h"
#include "resource.h"
#include "VideoCardDefine.h"
#include "..\..\..\Videocard\SV4000E\SV4000E.h"
#include "Videocard_SV4000E.h "
#include "afxdialogex.h"
static const long BrightnessDefault = 5000;
static const long ContrastDefault = 5000;
static const long SaturationDefault = 5000;
static const long HueDefault = 5000;
static const long SharpnessDefault = 4;
static BYTE g_DataBuffer[640*480*2];
static BYTE g_DataBuffer_NAV[640*480*2];
// CVideocard_SV4000E dialog
IMPLEMENT_DYNAMIC(CVideocard_SV4000E, CDialog)
CVideocard_SV4000E::CVideocard_SV4000E(CWnd* pParent /*=NULL*/)
: CDialog(CVideocard_SV4000E::IDD, pParent)
{
m_dwCard=0;
m_nDevNum=0;
m_bMirror=FALSE;
m_ConvertColorType=YUY2TORGB;
m_bSaveFile=FALSE;
}
CVideocard_SV4000E::~CVideocard_SV4000E()
{
}
void CVideocard_SV4000E::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
}
BEGIN_MESSAGE_MAP(CVideocard_SV4000E, CDialog)
ON_WM_TIMER()
ON_BN_CLICKED(IDC_RADIO_SV4000E_RGB, &CVideocard_SV4000E::OnBnClickedRadioSV4000ERgb)
ON_BN_CLICKED(IDC_RADIO_SV4000E_GRAY, &CVideocard_SV4000E::OnBnClickedRadioSV4000EGray)
ON_BN_CLICKED(IDC_SV4000E_CHECK_MIRROR_VERTICALLY, &CVideocard_SV4000E::OnBnClickedCheckSV4000EMirrorVertically)
ON_BN_CLICKED(IDC_BUTTON_SV4000E_SAVEFILE, &CVideocard_SV4000E::OnBnClickedButtonSV4000ESavefile)
ON_BN_CLICKED(IDCANCEL, &CVideocard_SV4000E::OnBnClickedCancel)
ON_BN_CLICKED(IDOK, &CVideocard_SV4000E::OnBnClickedOk)
ON_BN_CLICKED(IDC_RADIO_SV4000E_CHANNEL1, &CVideocard_SV4000E::OnBnClickedRadioSV4000EChannel1)
ON_BN_CLICKED(IDC_RADIO_SV4000E_CHANNEL2, &CVideocard_SV4000E::OnBnClickedRadioSV4000EChannel2)
ON_BN_CLICKED(IDC_RADIO_SV4000E_CHANNEL3, &CVideocard_SV4000E::OnBnClickedRadioSV4000EChannel3)
ON_BN_CLICKED(IDC_RADIO_SV4000E_CHANNEL4, &CVideocard_SV4000E::OnBnClickedRadioSV4000EChannel4)
END_MESSAGE_MAP()
// CVideocard_SV4000E message handlers
//====================================
BOOL CVideocard_SV4000E::OnInitDialog()
{
CDialog::OnInitDialog();
// Add "About..." menu item to system menu.
// IDM_ABOUTBOX must be in the system command range.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
BOOL bNameValid;
CString strAboutMenu;
bNameValid = strAboutMenu.LoadString(IDS_ABOUTBOX);
ASSERT(bNameValid);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
((CButton *)GetDlgItem(IDC_RADIO_SV4000E_RGB))->SetCheck(TRUE);
((CButton *)GetDlgItem(IDC_RADIO_SV4000E_GRAY))->SetCheck(FALSE);
bInitSdk=123;
m_Channel=0;
((CButton *)GetDlgItem(IDC_RADIO_SV4000E_CHANNEL1))->SetCheck(TRUE);
((CButton *)GetDlgItem(IDC_RADIO_SV4000E_CHANNEL2))->SetCheck(FALSE);
((CButton *)GetDlgItem(IDC_RADIO_SV4000E_CHANNEL3))->SetCheck(FALSE);
((CButton *)GetDlgItem(IDC_RADIO_SV4000E_CHANNEL4))->SetCheck(FALSE);
return TRUE; // return TRUE unless you set the focus to a control
}
//===================================================
void CVideocard_SV4000E::OnBnClickedOk()
{
for (int i=0;i<4;i++)
{
m_device[i]=NULL;
}
LoadVideocard();
SetTimer(1,50,NULL);
GetDlgItem(IDOK)->EnableWindow(false);
}
//===================================================
void CVideocard_SV4000E::OnBnClickedCancel()
{
KillTimer(1);
UnloadVideocard();
CDialog::OnCancel();
}
//===================================================
void CVideocard_SV4000E::OnBnClickedRadioSV4000ERgb()
{
m_ConvertColorType=YUY2TORGB;
}
//===================================================
void CVideocard_SV4000E::OnBnClickedRadioSV4000EGray()
{
m_ConvertColorType=YUY2TOGRAY;
}
//===================================================
void CVideocard_SV4000E::OnBnClickedCheckSV4000EMirrorVertically()
{
if (((CButton *)GetDlgItem(IDC_SV4000E_CHECK_MIRROR_VERTICALLY))->GetCheck())
{
m_bMirror=TRUE;
}
else
{
m_bMirror=FALSE;
}
}
//===================================================
void CVideocard_SV4000E::OnBnClickedButtonSV4000ESavefile()
{
CString CTmpString;
CString PathName;
CString path_and_fileName;
PathName=_T("SV4000E.bmp");
CString szFilter=_T("BMP Files(*.bmp)|*.bmp|ALL Files(*.*)|*.*||");
CFileDialog fdlg(FALSE,_T("BMP"),PathName,OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,szFilter);
if( fdlg.DoModal()==IDOK)
{
m_SaveFile=fdlg.GetPathName();
}
delete fdlg;
m_bSaveFile=TRUE;
}
//===================================================
void CVideocard_SV4000E::OnBnClickedRadioSV4000EChannel1()
{
#ifdef _RELEASE_FULL_VERSION
m_status=DXStopRawVideoCallback(m_device[m_Channel]);
m_Channel=0;
m_status=DXSetRawVideoCallback(m_device[m_Channel], SV4000EAPrcVidCapCallBack, this);
m_status=DXStartRawVideoCallback(m_device[m_Channel],SV4000EAPrcVidCapCallBack,this);
//m_status=DXStartPreview(m_device[m_Channel], GetDlgItem(IDC_STATIC_SV4000E_PICTURE)->GetSafeHwnd(), NULL, 0);
#endif //_RELEASE_FULL_VERSION
}
//===================================================
void CVideocard_SV4000E::OnBnClickedRadioSV4000EChannel2()
{
#ifdef _RELEASE_FULL_VERSION
m_status=DXStopRawVideoCallback(m_device[m_Channel]);
m_Channel=1;
m_status=DXSetRawVideoCallback(m_device[m_Channel], SV4000EAPrcVidCapCallBack, this);
m_status=DXStartRawVideoCallback(m_device[m_Channel],SV4000EAPrcVidCapCallBack,this);
//m_status=DXStartPreview(m_device[m_Channel], GetDlgItem(IDC_STATIC_SV4000E_PICTURE)->GetSafeHwnd(), NULL, 0);
#endif //_RELEASE_FULL_VERSION
}
//===================================================
void CVideocard_SV4000E::OnBnClickedRadioSV4000EChannel3()
{
#ifdef _RELEASE_FULL_VERSION
m_status=DXStopRawVideoCallback(m_device[m_Channel]);
m_Channel=2;
m_status=DXSetRawVideoCallback(m_device[m_Channel], SV4000EAPrcVidCapCallBack, this);
m_status=DXStartRawVideoCallback(m_device[m_Channel],SV4000EAPrcVidCapCallBack,this);
//m_status=DXStartPreview(m_device[m_Channel], GetDlgItem(IDC_STATIC_SV4000E_PICTURE)->GetSafeHwnd(), NULL, 0);
#endif //_RELEASE_FULL_VERSION
}
//===================================================
void CVideocard_SV4000E::OnBnClickedRadioSV4000EChannel4()
{
#ifdef _RELEASE_FULL_VERSION
m_status=DXStopRawVideoCallback(m_device[m_Channel]);
m_Channel=3;
m_status=DXSetRawVideoCallback(m_device[m_Channel], SV4000EAPrcVidCapCallBack, this);
m_status=DXStartRawVideoCallback(m_device[m_Channel],SV4000EAPrcVidCapCallBack,this);
//m_status=DXStartPreview(m_device[m_Channel], GetDlgItem(IDC_STATIC_SV4000E_PICTURE)->GetSafeHwnd(), NULL, 0);
#endif //_RELEASE_FULL_VERSION
}
//=======================================
BOOL CVideocard_SV4000E::LoadVideocard()
{
BOOL rStatus(FALSE);
#ifdef _RELEASE_FULL_VERSION
bInitSdk=DXInitialize();
m_nDevNum = DXGetDeviceCount();
if ((bInitSdk==0)&&(m_nDevNum>=4))
{
for (int i=0;i<m_nDevNum;i++)
{
OpenDevice(i,m_device[i]);
}
m_status=DXSetRawVideoCallback(m_device[m_Channel], SV4000EAPrcVidCapCallBack, this);
m_status=DXStartRawVideoCallback(m_device[m_Channel],SV4000EAPrcVidCapCallBack,this);
if((m_device[0]==NULL)||(m_device[2]==NULL))
{
::AfxMessageBox(_T("SV4000E卡打开设备失败!"));
rStatus=FALSE;
}
rStatus=TRUE;
}
else
{
::AfxMessageBox(_T("SV4000E卡初始化失败!"));
rStatus=FALSE;
}
#endif //_RELEASE_FULL_VERSION
return rStatus;
}
//=======================================
void CVideocard_SV4000E::OpenDevice(unsigned int _DevNo,device_handle &_OpenedDevice)
{
#ifdef _RELEASE_FULL_VERSION
_OpenedDevice= DXOpenDevice(_DevNo, NULL);
unsigned standard(VideoStandard_PAL_D);
unsigned colorspace(cs_yuy2);//cs_rgb24
unsigned width(640);//640
unsigned height(480);//480
float framerate(25);
m_status=DXSetVideoPara(_OpenedDevice,standard,colorspace,width,height,framerate);
DXDeviceRun(_OpenedDevice);
#else
UNREFERENCED_PARAMETER(_DevNo);
UNREFERENCED_PARAMETER(_OpenedDevice);
#endif //_RELEASE_FULL_VERSION
};
//=======================================
void CVideocard_SV4000E::CloseDevice(device_handle _Device)
{
#ifdef _RELEASE_FULL_VERSION
if (_Device)
{
DXStopPreview(_Device);
m_status=DXDeviceStop(_Device);
DXCloseDevice(_Device);
}
#else
UNREFERENCED_PARAMETER(_Device);
#endif //_RELEASE_FULL_VERSION
};
//=======================================
BOOL CVideocard_SV4000E::UnloadVideocard()
{
#ifdef _RELEASE_FULL_VERSION
m_status=DXStopRawVideoCallback(m_device[m_Channel]);
for (int i=0;i<m_nDevNum;i++)
{
CloseDevice(m_device[i]);
}
DXUninitialize();
#endif //_RELEASE_FULL_VERSION
return TRUE;
}
//================================================================
void CVideocard_SV4000E::ConvertVideoSubType(const Image_Buffer& _ImageBuffer, BYTE *_pSrcData,ConvertColorType _type,BOOL _bMirror)
{
int x=0;
int y=0;
long lCnt1=0;
long lCnt2=0;
long lCnt3=0;
int Color_R=0,Color_G=0,Color_B=0;
BYTE *pDstData=NULL;
for(y=0;y<480;y++)
{
lCnt1=0;
if(!_bMirror)
pDstData=(BYTE*)_ImageBuffer.ScanLine[y];
else
pDstData=(BYTE*)_ImageBuffer.ScanLine[479-y];
for(x=0;x<640*3;x+=3)
{
switch(_type)
{
case RGB24TORGB:
{
pDstData[x+2]=_pSrcData[y*640*3+x+2];
pDstData[x+1]=_pSrcData[y*640*3+x+1];
pDstData[x]=_pSrcData[y*640*3+x];
break;
}
case YUY2TORGB:
{
Color_R=(1164*(_pSrcData[lCnt2*2]-16)+1596*(_pSrcData[lCnt3+3]-128))/1000;
if(Color_R>255)Color_R=255;
if(Color_R<0)Color_R=0;
pDstData[x+2]=static_cast<BYTE>(Color_R);
Color_G=(1164*(_pSrcData[lCnt2*2]-16)-813*(_pSrcData[lCnt3+1]-128)-392*(_pSrcData[lCnt3+3]-128))/1000;
if(Color_G>255)Color_G=255;
if(Color_G<0)Color_G=0;
pDstData[x+1]=static_cast<BYTE>(Color_G);
Color_B=(1164*(_pSrcData[lCnt2*2]-16)+2017*(_pSrcData[lCnt3+1]-128))/1000;
if(Color_B>255)Color_B=255;
if(Color_B<0)Color_B=0;
pDstData[x]=static_cast<BYTE>(Color_B);
break;
}
case RGB24TOGRAY:
{
pDstData[x+2]=(_pSrcData[lCnt2*3+2]+_pSrcData[lCnt2*3+1]+_pSrcData[lCnt2*3])/3;
pDstData[x+1]=(_pSrcData[lCnt2*3+2]+_pSrcData[lCnt2*3+1]+_pSrcData[lCnt2*3])/3;
pDstData[x]=(_pSrcData[lCnt2*3+2]+_pSrcData[lCnt2*3+1]+_pSrcData[lCnt2*3])/3;
break;
}
case YUY2TOGRAY:
{
pDstData[x+2]=_pSrcData[2*lCnt2];
pDstData[x+1]=_pSrcData[2*lCnt2];
pDstData[x]=_pSrcData[2*lCnt2];
break;
}
}
if((lCnt1%2)==1)
lCnt3=lCnt3+4;
lCnt2++;
lCnt1++;
}
}
}
//================================================================
BOOL CVideocard_SV4000E::SaveBitmapToFile(const CBitmap& _bitmap, CString _lpFileName)
{
HBITMAP hBitmap; // 为刚才的屏幕位图句柄
HDC hDC; //设备描述表
int iBits; //当前显示分辨率下每个像素所占字节数
WORD wBitCount(24); //位图中每个像素所占字节数
DWORD dwPaletteSize = 0, //定义调色板大小
dwBmBitsSize, //位图中像素字节大小
dwDIBSize, //位图文件大小
dwWritten; //写入文件字节数
BITMAP Bitmap; //位图属性结构
BITMAPFILEHEADER bmhFiledr; //位图文件头结构
BITMAPINFOHEADER bi; //位图信息头结构
LPBITMAPINFOHEADER lpbi; //指向位图信息头结构
HANDLE hFile, //定义文件
hDib, //分配内存句柄
hPal, //调色板句柄
hOldPal = NULL;
//计算位图文件每个像素所占字节数
hBitmap = (HBITMAP)_bitmap;
hDC = CreateDC(_T("DISPLAY"),NULL,NULL,NULL);
iBits = GetDeviceCaps(hDC, BITSPIXEL) * GetDeviceCaps(hDC, PLANES);
DeleteDC(hDC);
if (iBits <= 1)
wBitCount = 1;
else if (iBits <= 4)
wBitCount = 4;
else if (iBits <= 8)
wBitCount = 8;
else if (iBits <= 24)
wBitCount = 24;
else if (iBits <= 32)
wBitCount = 32;
//计算调色板大小
if (wBitCount <= 8)
dwPaletteSize = (1 << wBitCount) * sizeof (RGBQUAD);
//设置位图信息头结构
GetObject(hBitmap, sizeof (BITMAP), (LPSTR)&Bitmap);
bi.biSize = sizeof (BITMAPINFOHEADER);
bi.biWidth = Bitmap.bmWidth;
bi.biHeight = Bitmap.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = wBitCount;
bi.biCompression = BI_RGB;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;
dwBmBitsSize = ((Bitmap.bmWidth * wBitCount+31) / 32) * 4 * Bitmap.bmHeight;
//为位图内容分配内存
hDib = GlobalAlloc(GHND, dwBmBitsSize + dwPaletteSize + sizeof (BITMAPINFOHEADER));
lpbi = (LPBITMAPINFOHEADER)GlobalLock(hDib);
*lpbi = bi;
// 处理调色板
hPal = GetStockObject(DEFAULT_PALETTE);
if (hPal)
{
hDC = ::GetDC(NULL);
hOldPal = ::SelectPalette(hDC, (HPALETTE)hPal, FALSE);
RealizePalette(hDC);
}
// 获取该调色板下新的像素值
GetDIBits(hDC, hBitmap, 0, (UINT) Bitmap.bmHeight, (LPSTR)lpbi + sizeof (BITMAPINFOHEADER) + dwPaletteSize, (LPBITMAPINFO)lpbi, DIB_RGB_COLORS);
//恢复调色板
if (hOldPal)
{
SelectPalette(hDC, (HPALETTE)hOldPal, TRUE);
RealizePalette(hDC);
::ReleaseDC(NULL, hDC);
}
//创建位图文件
hFile = CreateFile(_lpFileName, GENERIC_WRITE,
0, NULL, CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN, NULL);
if (hFile == INVALID_HANDLE_VALUE)
return FALSE;
// 设置位图文件头
bmhFiledr.bfType = 0x4D42; // "BM"
dwDIBSize = sizeof (BITMAPFILEHEADER) + sizeof (BITMAPINFOHEADER) + dwPaletteSize + dwBmBitsSize;
bmhFiledr.bfSize = dwDIBSize;
bmhFiledr.bfReserved1 = 0;
bmhFiledr.bfReserved2 = 0;
bmhFiledr.bfOffBits = (DWORD)sizeof (BITMAPFILEHEADER) + (DWORD)sizeof (BITMAPINFOHEADER) + dwPaletteSize;
// 写入位图文件头
WriteFile(hFile, (LPSTR)&bmhFiledr, sizeof(BITMAPFILEHEADER), &dwWritten, NULL);
// 写入位图文件其余内容
WriteFile(hFile, (LPSTR)lpbi, dwDIBSize,&dwWritten, NULL);
//清除
GlobalUnlock(hDib);
GlobalFree(hDib);
CloseHandle(hFile);
return TRUE;
};
//================================================================
void CVideocard_SV4000E::OnPaint()
{
CDC* dc= this->GetDC();
int nMode;
CDC* pMemDC = new CDC;
CBitmap pBitBmp;
CBitmap pBitBmpNav;
ConvertVideoSubType(m_ImageBuffer,g_DataBuffer,m_ConvertColorType,m_bMirror);
BYTE *pData = (BYTE *)m_ImageBuffer.ScanLine;
BITMAPINFO bmpInfo;
bmpInfo.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
bmpInfo.bmiHeader.biWidth = 640;
bmpInfo.bmiHeader.biHeight = 480;
bmpInfo.bmiHeader.biPlanes = 1;
bmpInfo.bmiHeader.biBitCount = 24;//X位色
bmpInfo.bmiHeader.biCompression = BI_RGB;
bmpInfo.bmiHeader.biSizeImage = 0;
bmpInfo.bmiHeader.biXPelsPerMeter = 30000;
bmpInfo.bmiHeader.biYPelsPerMeter = 30000;
bmpInfo.bmiHeader.biClrUsed = 0;
bmpInfo.bmiHeader.biClrImportant = 0;
pBitBmp.CreateCompatibleBitmap(dc,640,480);
SetDIBits(dc->m_hDC,pBitBmp,0,480,pData,&bmpInfo,DIB_RGB_COLORS);
if (m_bSaveFile)
{
SaveBitmapToFile(pBitBmp,m_SaveFile);
//CImage imgTemp;
//imgTemp.Attach(pBitBmp.operator HBITMAP());
//imgTemp.Save(m_SaveFile);
m_bSaveFile=FALSE;
}
if (!pMemDC->m_hDC)
{
pMemDC->CreateCompatibleDC(dc);
}
CBitmap* pOldBitmap = pMemDC->SelectObject(&pBitBmp);
nMode = pMemDC->SetBkMode(TRANSPARENT);
dc->BitBlt(0, 0, 640, 480, pMemDC,0,0, SRCCOPY);
pMemDC->SetBkMode(nMode);
pMemDC->SelectObject(pOldBitmap);
ReleaseDC(pMemDC);
delete pMemDC;
ReleaseDC(dc);
}
//================================================================================================
void CVideocard_SV4000E::OnTimer(UINT_PTR nIDEvent)
{
switch(nIDEvent)
{
case 1:
{
OnPaint();
break;
}
}
CDialog::OnTimer(nIDEvent);
}
//==================================SV4000E=====================================
unsigned CALLBACK SV4000EAPrcVidCapCallBack(unsigned char* buffer, unsigned colorSpace, unsigned width, unsigned height, unsigned bytesWidth, void* context)
{
UNREFERENCED_PARAMETER(colorSpace);
UNREFERENCED_PARAMETER(context);
UNREFERENCED_PARAMETER(bytesWidth);
memcpy(g_DataBuffer,(BYTE*)buffer,width*height*2);
return 0;
}
//==================================SV4000E=====================================
unsigned CALLBACK SV4000EAPrcVidCapCallBackNav(unsigned char* buffer, unsigned colorSpace, unsigned width, unsigned height, unsigned bytesWidth, void* context)
{
UNREFERENCED_PARAMETER(colorSpace);
UNREFERENCED_PARAMETER(context);
UNREFERENCED_PARAMETER(bytesWidth);
memcpy(g_DataBuffer_NAV,(BYTE*)buffer,width*height*2);
return 0;
};
@@ -0,0 +1,58 @@
#pragma once
// CVideocard_SV4000E dialog
unsigned CALLBACK SV4000EAPrcVidCapCallBack(unsigned char* buffer, unsigned colorSpace, unsigned width, unsigned height, unsigned bytesWidth, void* context);
unsigned CALLBACK SV4000EAPrcVidCapCallBackNav(unsigned char* buffer, unsigned colorSpace, unsigned width, unsigned height, unsigned bytesWidth, void* context);
class CVideocard_SV4000E : public CDialog
{
DECLARE_DYNAMIC(CVideocard_SV4000E)
public:
CVideocard_SV4000E(CWnd* pParent = NULL); // standard constructor
virtual ~CVideocard_SV4000E();
// Dialog Data
enum { IDD = IDD_SO7_VIDEOCARD_SV4000E };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support
virtual BOOL OnInitDialog();
afx_msg void OnPaint();
afx_msg void OnTimer(UINT_PTR nIDEvent);
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedRadioSV4000ERgb();
afx_msg void OnBnClickedRadioSV4000EGray();
afx_msg void OnBnClickedCheckSV4000EMirrorVertically();
afx_msg void OnBnClickedButtonSV4000ESavefile();
afx_msg void OnBnClickedCancel();
afx_msg void OnBnClickedOk();
protected:
unsigned int m_status;
device_handle m_device[4];
int m_nDevNum;
DWORD m_dwCard;
Image_Buffer m_ImageBuffer;
Image_Buffer m_ImageBuffer_Nav;
ConvertColorType m_ConvertColorType;
BOOL m_bMirror;
BOOL m_bSaveFile;
CString m_SaveFile;
unsigned int m_Channel;
unsigned int bInitSdk;
public:
BOOL LoadVideocard();
BOOL UnloadVideocard();
void OpenDevice(unsigned int _DevNo,device_handle &_OpenedDevice);
void CloseDevice(device_handle _Device);
void ConvertVideoSubType(const Image_Buffer& _ImageBuffer, BYTE *pSrcData,ConvertColorType _type,BOOL _bMirror);
BOOL SaveBitmapToFile(const CBitmap& bitmap, CString lpFileName);
afx_msg void OnBnClickedRadioSV4000EChannel1();
afx_msg void OnBnClickedRadioSV4000EChannel2();
afx_msg void OnBnClickedRadioSV4000EChannel3();
afx_msg void OnBnClickedRadioSV4000EChannel4();
};
@@ -45,6 +45,7 @@
#define IDD_SO7_VIDEOCARD_TC4000 166
#define IDD_SO7_UTIL_MANUAL_MACHINE 167
#define IDD_SO7_UTIL_VERIFICATION_ALGORITHM 168
#define IDD_SO7_VIDEOCARD_SV4000E 169
#define IDC_BUTTON_INIT_MVUSB 1001
#define IDC_BUTTON_START_MACHINE 1002
#define IDC_BUTTON_START_POLL_58 1004
@@ -758,7 +759,16 @@
#define IDC_RADIO_SPEED_GEAR5 1666
#define IDC_EDIT_SO7_READ_IO_STATUS_ADDRESS 1667
#define IDC_RADIO_VIDEOCARD_SV4000E 1668
#define IDC_RADIO_SV4000E_RGB 1669
#define IDC_MFCBUTTON_STATUS_IN_PORT6 1670
#define IDC_RADIO_SV4000E_GRAY 1670
#define IDC_RADIO_SV4000E_CHANNEL1 1671
#define IDC_RADIO_SV4000E_CHANNEL2 1672
#define IDC_RADIO_SV4000E_CHANNEL3 1673
#define IDC_RADIO_SV4000E_CHANNEL4 1674
#define IDC_SV4000E_CHECK_MIRROR_VERTICALLY 1675
#define IDC_BUTTON_SV4000E_SAVEFILE 1676
#define IDC_STATIC_SV4000E_PICTURE 1677
// Next default values for new objects
//
@@ -766,7 +776,7 @@
#ifndef APSTUDIO_READONLY_SYMBOLS
#define _APS_NEXT_RESOURCE_VALUE 169
#define _APS_NEXT_COMMAND_VALUE 32771
#define _APS_NEXT_CONTROL_VALUE 1669
#define _APS_NEXT_CONTROL_VALUE 1678
#define _APS_NEXT_SYMED_VALUE 104
#endif
#endif