using GxIAPINET;
using System.ComponentModel;
using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.Drawing.Imaging;
using System.Runtime.InteropServices;
using System.Text.RegularExpressions;
using TeamAAS.Camera.Images;
using TeamAAS.Camera.Models;
using TeamAAS.Camera.Attributes;
using TeamAAS.Camera.Enums;
namespace TeamAAS.Camera.Cameras
{
///
/// 大恒相机(GxIAPINET SDK)
///
[Camera("Galaxy", "大恒相机")]
public class GalaxyCamera : CameraBase
{
#region 字段
static IGXFactory m_objIGXFactory = null;
IGXDevice m_objIGXDevice = null;
IGXStream m_objIGXStream = null;
static List m_listIGXDeviceInfo = new List();
IGXFeatureControl m_objIGXFeatureControl = null;
IGXFeatureControl m_objIGXStreamFeatureControl = null;
IntPtr m_pOutBuffer = IntPtr.Zero;
IntPtr m_pBitmapInfo = IntPtr.Zero;
bool m_bIsColor = false;
byte[] m_byMonoBuffer = null;
byte[] m_byColorBuffer = null;
int m_nWidth = 0;
int m_nHeight = 0;
IGXImageFormatConvert m_objImageFormatConvert = null;
CWin32Bitmaps.BITMAPINFO m_objBitmapInfo = new CWin32Bitmaps.BITMAPINFO();
private bool IsHaveCamera = false;
#endregion
[Browsable(false)]
public override string CameraBrand => "大恒相机";
public GalaxyCamera(Guid id, int index, string name, string serialNumber, string cameraIp, bool isFindByIp)
: base(id, index, name, serialNumber, cameraIp, isFindByIp)
{
var list = GetDevices();
foreach (var device in list)
{
if (device.CameraType == CameraType.GIGE)
{
if (IsFindByIp)
{
if (device.CameraIp == CameraIp)
{
IsHaveCamera = true;
ManufacturerName = device.ManufacturerName;
ModelName = device.Model;
SerialNumber = device.SerialNumber;
CameraType = CameraType.GIGE;
break;
}
}
else
{
if (device.SerialNumber == serialNumber)
{
IsHaveCamera = true;
ManufacturerName = device.ManufacturerName;
ModelName = device.Model;
SerialNumber = device.SerialNumber;
CameraType = CameraType.GIGE;
break;
}
}
}
else
{
if (device.SerialNumber == serialNumber)
{
IsHaveCamera = true;
ManufacturerName = device.ManufacturerName;
ModelName = device.Model;
SerialNumber = device.SerialNumber;
CameraType = CameraType.GIGE;
break;
}
}
}
IsConnected = false;
}
#region 设备发现
public static CameraInfo[] GetDevices()
{
m_objIGXFactory = IGXFactory.GetInstance();
m_objIGXFactory.Init();
List cameras = new List();
if (!CheckSoftwareInstalled().isInstalled)
{
return cameras.ToArray();
}
m_listIGXDeviceInfo.Clear();
if (null != m_objIGXFactory)
{
m_objIGXFactory.UpdateAllDeviceList(200, m_listIGXDeviceInfo);
}
if (m_listIGXDeviceInfo.Count <= 0)
{
return cameras.ToArray();
}
for (int i = 0; i < m_listIGXDeviceInfo.Count; i++)
{
var deviceType = m_listIGXDeviceInfo[i].GetDeviceClass();
if (deviceType == GX_DEVICE_CLASS_LIST.GX_DEVICE_CLASS_GEV)
{
cameras.Add(new CameraInfo()
{
CameraNo = i + 1,
CameraName = m_listIGXDeviceInfo[i].GetDisplayName(),
CameraBrand = "大恒相机",
CameraType = CameraType.GIGE,
ManufacturerName = m_listIGXDeviceInfo[i].GetVendorName(),
Model = m_listIGXDeviceInfo[i].GetModelName(),
SerialNumber = m_listIGXDeviceInfo[i].GetSN(),
CameraIp = m_listIGXDeviceInfo[i].GetIP(),
IsFindByIp = true,
});
}
else if (deviceType == GX_DEVICE_CLASS_LIST.GX_DEVICE_CLASS_USB2 || deviceType == GX_DEVICE_CLASS_LIST.GX_DEVICE_CLASS_U3V)
{
cameras.Add(new CameraInfo()
{
CameraNo = i + 1,
CameraName = m_listIGXDeviceInfo[i].GetDisplayName(),
CameraBrand = "大恒相机",
CameraType = CameraType.USB,
ManufacturerName = m_listIGXDeviceInfo[i].GetVendorName(),
Model = m_listIGXDeviceInfo[i].GetModelName(),
SerialNumber = m_listIGXDeviceInfo[i].GetSN(),
CameraIp = "",
});
}
else if (deviceType == GX_DEVICE_CLASS_LIST.GX_DEVICE_CLASS_UNKNOWN)
{
cameras.Add(new CameraInfo()
{
CameraNo = i + 1,
CameraName = m_listIGXDeviceInfo[i].GetDisplayName(),
CameraBrand = "大恒相机",
CameraType = CameraType.Unknown,
ManufacturerName = m_listIGXDeviceInfo[i].GetVendorName(),
Model = m_listIGXDeviceInfo[i].GetModelName(),
SerialNumber = m_listIGXDeviceInfo[i].GetSN(),
CameraIp = "",
});
}
}
return cameras.ToArray();
}
public static (bool isInstalled, string version) CheckSoftwareInstalled()
{
string softwareName = "Galaxy";
string softwareVersion = "2.4.2504";
string[] registryPaths = new[]
{
@"SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall",
@"SOFTWARE\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall"
};
foreach (var path in registryPaths)
{
using (RegistryKey key = Registry.LocalMachine.OpenSubKey(path))
{
if (key == null) continue;
foreach (string subKeyName in key.GetSubKeyNames())
{
using (RegistryKey subKey = key.OpenSubKey(subKeyName))
{
string displayName = subKey?.GetValue("DisplayName")?.ToString();
if (displayName != null && displayName.Contains(softwareName))
{
string version = subKey.GetValue("DisplayName")?.ToString();
var match = Regex.Match(version, @"\d+(?:\.\d+)+");
if (match.Success)
{
version = match.Value;
}
else
{
continue;
}
Version v1 = new Version(version);
Version v2 = new Version(softwareVersion);
if (v1 >= v2)
{
return (true, version);
}
else
{
return (false, version);
}
}
}
}
}
}
return (false, "");
}
#endregion
#region SDK 实现
public override bool OpenDevice()
{
using (WriteLockScope())
{
try
{
var list = GetDevices();
foreach (var device in list)
{
if (device.SerialNumber == SerialNumber)
{
IsHaveCamera = true;
break;
}
}
if (!IsHaveCamera)
{
return false;
}
if (null != m_objIGXDevice)
{
m_objIGXDevice.Close();
m_objIGXDevice = null;
}
m_objIGXDevice = m_objIGXFactory.OpenDeviceBySN(SerialNumber, GxIAPINET.GX_ACCESS_MODE.GX_ACCESS_EXCLUSIVE);
m_objIGXFeatureControl = m_objIGXDevice.GetRemoteFeatureControl();
if (null != m_objIGXDevice)
{
m_objIGXStream = m_objIGXDevice.OpenStream(0);
m_objIGXStreamFeatureControl = m_objIGXStream.GetFeatureControl();
}
GX_DEVICE_CLASS_LIST objDeviceClass = m_objIGXDevice.GetDeviceInfo().GetDeviceClass();
if (GX_DEVICE_CLASS_LIST.GX_DEVICE_CLASS_GEV == objDeviceClass)
{
if (true == m_objIGXFeatureControl.IsImplemented("GevSCPSPacketSize"))
{
uint nPacketSize = m_objIGXStream.GetOptimalPacketSize();
m_objIGXFeatureControl.GetIntFeature("GevSCPSPacketSize").SetValue(nPacketSize);
}
}
if (null != m_objIGXFeatureControl)
{
// 按当前触发模式下发(默认连续采集 = TriggerMode Off,与历史硬编码一致)
ApplyTriggerToHardware(TriggerMode);
}
ReleaseBuffer();
GxBitmap();
if (null != m_objIGXStreamFeatureControl)
{
try
{
m_objIGXStreamFeatureControl.GetEnumFeature("StreamBufferHandlingMode").SetValue("OldestFirst");
}
catch (Exception)
{
}
}
if (!IsConnected)
{
OnConnectChanged(true);
}
IsConnected = true;
return IsConnected;
}
catch (Exception ex)
{
ErrorMessage = ex.Message;
IsConnected = false;
return false;
}
}
}
public override void CloseDevice()
{
using (WriteLockScope())
{
try
{
if (null != m_objIGXStream)
{
m_objIGXStream.StopGrab();
m_objIGXStream.UnregisterCaptureCallback();
m_objIGXStream.Close();
m_objIGXStream = null;
m_objIGXStreamFeatureControl = null;
}
if (null != m_objIGXDevice)
{
m_objIGXDevice.Close();
m_objIGXDevice = null;
}
if (null != m_objIGXFactory)
{
m_objIGXFactory.Uninit();
}
}
catch (Exception)
{
}
ReleaseBuffer();
IsConnected = false;
OnConnectChanged(false);
}
}
#region 触发模式
/// 大恒(Galaxy)支持连续/软触发/硬触发(Line0)
public override IReadOnlyList SupportedTriggerModes => FullTriggerModes;
/// 历史行为:OpenDevice 硬编码 TriggerMode=Off,故默认连续采集
protected override CameraTriggerMode DefaultTriggerMode => CameraTriggerMode.连续采集;
protected override bool ApplyTriggerMode(CameraTriggerMode mode)
{
using (WriteLockScope())
return ApplyTriggerToHardware(mode);
}
///
/// 把触发模式下发到大恒 GxIAPINET(GenICam 字符串接口)。
/// 调用方需已持有写锁(OpenDevice/Grab 内部已在锁内;锁可重入)。
///
private bool ApplyTriggerToHardware(CameraTriggerMode mode)
{
if (null == m_objIGXFeatureControl) return false;
m_objIGXFeatureControl.GetEnumFeature("AcquisitionMode").SetValue("Continuous");
switch (mode)
{
case CameraTriggerMode.连续采集:
m_objIGXFeatureControl.GetEnumFeature("TriggerMode").SetValue("Off");
return true;
case CameraTriggerMode.软触发:
m_objIGXFeatureControl.GetEnumFeature("TriggerSource").SetValue("Software");
m_objIGXFeatureControl.GetEnumFeature("TriggerMode").SetValue("On");
return true;
case CameraTriggerMode.硬触发上升沿:
case CameraTriggerMode.硬触发下降沿:
m_objIGXFeatureControl.GetEnumFeature("TriggerSource").SetValue("Line0");
m_objIGXFeatureControl.GetEnumFeature("TriggerActivation").SetValue(
mode == CameraTriggerMode.硬触发上升沿 ? "Rising" : "Falling");
m_objIGXFeatureControl.GetEnumFeature("TriggerMode").SetValue("On");
return true;
default: // 跟随相机:不下发,沿用相机自身配置
return true;
}
}
#endregion
public override GenImage Grab()
{
using (WriteLockScope())
{
var sw = Stopwatch.StartNew();
dynamic objIImageData = null;
try
{
if (null == m_objIGXDevice || !IsConnected)
{
ErrorMessage = "相机未连接";
return null;
}
if (null != m_objIGXStream)
{
m_objIGXStream.StartGrab();
}
if (null != m_objIGXFeatureControl)
{
m_objIGXFeatureControl.GetCommandFeature("AcquisitionStart").Execute();
// 仅软触发模式需主动发触发命令;连续采集自由出图,硬触发等外部信号
if (IsSoftwareTrigger)
m_objIGXFeatureControl.GetCommandFeature("TriggerSoftware").Execute();
}
objIImageData = m_objIGXStream.GetImageNoThrow(500);
GX_VALID_BIT_LIST emValidBits = GX_VALID_BIT_LIST.GX_BIT_0_7;
if (null != objIImageData)
{
emValidBits = GetBestValudBit(objIImageData.GetPixelFormat());
if (GX_FRAME_STATUS_LIST.GX_FRAME_STATUS_SUCCESS == objIImageData.GetStatus())
{
if (m_bIsColor)
{
IntPtr pRGB24Buffer = IntPtr.Zero;
if (objIImageData.GetPixelFormat() == GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BGR8)
{
byte[] byColorBufferTmp = new byte[__GetStride(m_nWidth, m_bIsColor) * m_nHeight];
Marshal.Copy(objIImageData.GetBuffer(), byColorBufferTmp, 0, __GetStride(m_nWidth, m_bIsColor) * m_nHeight);
pRGB24Buffer = objIImageData.GetBuffer();
for (int i = 0; i < m_nHeight; i++)
{
Buffer.BlockCopy(byColorBufferTmp, (m_nHeight - i - 1) * m_nWidth * 3, m_byColorBuffer, i * m_nWidth * 3, m_nWidth * 3);
}
}
else
{
m_objImageFormatConvert.SetDstFormat(GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BGR8);
UInt64 i64DstBufferize = m_objImageFormatConvert.GetBufferSizeForConversion(objIImageData);
m_objImageFormatConvert.SetValidBits(emValidBits);
m_objImageFormatConvert.Convert(objIImageData, m_pOutBuffer, i64DstBufferize, true);
Marshal.Copy(m_pOutBuffer, m_byColorBuffer, 0, __GetStride(m_nWidth, m_bIsColor) * m_nHeight);
pRGB24Buffer = m_pOutBuffer;
}
Image = GenImage.FromIntPtr(m_nWidth, m_nHeight, PixelType.BGR24, pRGB24Buffer, m_nWidth * 3);
}
else
{
IntPtr pRaw8Buffer = IntPtr.Zero;
if (__IsPixelFormat8(objIImageData.GetPixelFormat()))
{
byte[] byMonoBufferTmp = new byte[__GetStride(m_nWidth, m_bIsColor) * m_nHeight];
Marshal.Copy(objIImageData.GetBuffer(), byMonoBufferTmp, 0, __GetStride(m_nWidth, m_bIsColor) * m_nHeight);
pRaw8Buffer = objIImageData.GetBuffer();
for (int i = 0; i < m_nHeight; i++)
{
Buffer.BlockCopy(byMonoBufferTmp, (m_nHeight - i - 1) * m_nWidth, m_byMonoBuffer, i * m_nWidth, m_nWidth);
}
}
else
{
m_objImageFormatConvert.SetDstFormat(GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_MONO8);
UInt64 i64DstBufferize = m_objImageFormatConvert.GetBufferSizeForConversion(objIImageData);
m_objImageFormatConvert.SetValidBits(emValidBits);
m_objImageFormatConvert.Convert(objIImageData, m_pOutBuffer, i64DstBufferize, true);
Marshal.Copy(m_pOutBuffer, m_byMonoBuffer, 0, __GetStride(m_nWidth, m_bIsColor) * m_nHeight);
pRaw8Buffer = m_pOutBuffer;
}
Image = GenImage.FromIntPtr(m_nWidth, m_nHeight, PixelType.Grey8, pRaw8Buffer, m_nWidth);
}
}
}
if (Image != null)
{
ImageWidth = (uint)Image.Width;
ImageHeight = (uint)Image.Height;
ApplyGammaToImage(Image);
ErrorMessage = "";
TotalTime = sw.Elapsed;
return Image;
}
}
catch (Exception ex)
{
CloseDevice();
OpenDevice();
ErrorMessage = ex.Message;
}
finally
{
if (null != objIImageData)
{
objIImageData.Destroy();
}
}
return null;
}
}
public override bool SetExposureTime(float exposureTime)
{
using (WriteLockScope())
{
try
{
if (m_objIGXFeatureControl != null)
{
m_objIGXFeatureControl.GetFloatFeature("ExposureTime").SetValue(exposureTime);
return true;
}
}
catch { }
return true;
}
}
public override float GetExposureTime()
{
using (ReadLockScope())
{
try
{
if (m_objIGXFeatureControl != null)
{
return (float)m_objIGXFeatureControl.GetFloatFeature("ExposureTime").GetValue();
}
}
catch { }
return 0;
}
}
public override bool SetGain(float gain)
{
using (WriteLockScope())
{
try
{
if (m_objIGXFeatureControl != null)
{
m_objIGXFeatureControl.GetFloatFeature("Gain").SetValue(gain);
return true;
}
}
catch { }
return true;
}
}
public override float GetGain()
{
using (ReadLockScope())
{
try
{
if (m_objIGXFeatureControl != null)
{
return (float)m_objIGXFeatureControl.GetFloatFeature("Gain").GetValue();
}
}
catch { }
return 0;
}
}
public override bool SetGamma(float gamma)
{
using (WriteLockScope())
{
try
{
if (m_objIGXFeatureControl != null && m_objIGXFeatureControl.IsImplemented("Gamma"))
{
m_objIGXFeatureControl.GetFloatFeature("Gamma").SetValue(gamma);
return true;
}
}
catch { }
UpdateGammaSnapshot(gamma);
return true;
}
}
public override float GetGamma()
{
using (ReadLockScope())
{
try
{
if (m_objIGXFeatureControl != null && m_objIGXFeatureControl.IsImplemented("Gamma"))
{
return (float)m_objIGXFeatureControl.GetFloatFeature("Gamma").GetValue();
}
}
catch { }
return Gamma;
}
}
#endregion
#region 辅助方法
public void GxBitmap()
{
m_objImageFormatConvert = m_objIGXFactory.CreateImageFormatConvert();
if (null != m_objIGXDevice)
{
m_nWidth = (int)m_objIGXDevice.GetRemoteFeatureControl().GetIntFeature("Width").GetValue();
m_nHeight = (int)m_objIGXDevice.GetRemoteFeatureControl().GetIntFeature("Height").GetValue();
ImageWidth = (uint)m_nWidth;
ImageHeight = (uint)m_nHeight;
IsSupportColor(ref m_bIsColor);
}
m_byMonoBuffer = new byte[__GetStride(m_nWidth, m_bIsColor) * m_nHeight];
m_byColorBuffer = new byte[__GetStride(m_nWidth, m_bIsColor) * m_nHeight];
m_pOutBuffer = Marshal.AllocCoTaskMem(__GetStride(m_nWidth, m_bIsColor) * m_nHeight);
if (m_bIsColor)
{
m_objBitmapInfo.bmiHeader.biSize = (uint)Marshal.SizeOf(typeof(CWin32Bitmaps.BITMAPINFOHEADER));
m_objBitmapInfo.bmiHeader.biWidth = m_nWidth;
m_objBitmapInfo.bmiHeader.biHeight = m_nHeight;
m_objBitmapInfo.bmiHeader.biPlanes = 1;
m_objBitmapInfo.bmiHeader.biBitCount = 24;
m_objBitmapInfo.bmiHeader.biCompression = 0;
m_objBitmapInfo.bmiHeader.biSizeImage = 0;
m_objBitmapInfo.bmiHeader.biXPelsPerMeter = 0;
m_objBitmapInfo.bmiHeader.biYPelsPerMeter = 0;
m_objBitmapInfo.bmiHeader.biClrUsed = 0;
m_objBitmapInfo.bmiHeader.biClrImportant = 0;
}
else
{
m_objBitmapInfo.bmiHeader.biSize = (uint)Marshal.SizeOf(typeof(CWin32Bitmaps.BITMAPINFOHEADER));
m_objBitmapInfo.bmiHeader.biWidth = m_nWidth;
m_objBitmapInfo.bmiHeader.biHeight = m_nHeight;
m_objBitmapInfo.bmiHeader.biPlanes = 1;
m_objBitmapInfo.bmiHeader.biBitCount = 8;
m_objBitmapInfo.bmiHeader.biCompression = 0;
m_objBitmapInfo.bmiHeader.biSizeImage = 0;
m_objBitmapInfo.bmiHeader.biXPelsPerMeter = 0;
m_objBitmapInfo.bmiHeader.biYPelsPerMeter = 0;
m_objBitmapInfo.bmiHeader.biClrUsed = 0;
m_objBitmapInfo.bmiHeader.biClrImportant = 0;
m_objBitmapInfo.bmiColors = new CWin32Bitmaps.RGBQUAD[256];
for (int i = 0; i < 256; i++)
{
m_objBitmapInfo.bmiColors[i].rgbBlue = (byte)i;
m_objBitmapInfo.bmiColors[i].rgbGreen = (byte)i;
m_objBitmapInfo.bmiColors[i].rgbRed = (byte)i;
m_objBitmapInfo.bmiColors[i].rgbReserved = 0;
}
}
m_pBitmapInfo = Marshal.AllocHGlobal(2048);
Marshal.StructureToPtr(m_objBitmapInfo, m_pBitmapInfo, false);
}
public void ReleaseBuffer()
{
if (m_pOutBuffer != IntPtr.Zero)
{
Marshal.FreeCoTaskMem(m_pOutBuffer);
m_pOutBuffer = IntPtr.Zero;
}
if (m_pBitmapInfo != IntPtr.Zero)
{
Marshal.FreeHGlobal(m_pBitmapInfo);
m_pBitmapInfo = IntPtr.Zero;
}
}
public void IsSupportColor(ref bool bIsColorFilter)
{
bool bIsImplemented = false;
bool bIsMono = false;
string strPixelFormat = "";
uint nPixelFormatValue = 0;
strPixelFormat = m_objIGXDevice.GetRemoteFeatureControl().GetEnumFeature("PixelFormat").GetValue();
if (0 == string.Compare(strPixelFormat, 0, "Mono", 0, 4))
{
bIsMono = true;
}
else
{
bIsMono = false;
}
CDecide.GetConvertPixelFormat(strPixelFormat, ref nPixelFormatValue);
bIsImplemented = CDecide.GetIsGray(nPixelFormatValue);
if ((!bIsMono) && (!bIsImplemented))
{
bIsColorFilter = true;
}
else
{
bIsColorFilter = false;
}
}
private int __GetStride(int nWidth, bool bIsColor)
{
return bIsColor ? nWidth * 3 : nWidth;
}
public GX_VALID_BIT_LIST GetBestValudBit(GX_PIXEL_FORMAT_ENTRY emPixelFormatEntry)
{
GX_VALID_BIT_LIST emValidBits = GX_VALID_BIT_LIST.GX_BIT_0_7;
switch (emPixelFormatEntry)
{
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_MONO8:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_GR8:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_RG8:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_GB8:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_BG8:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_RGB8:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BGR8:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_R8:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_G8:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_B8:
emValidBits = GX_VALID_BIT_LIST.GX_BIT_0_7;
break;
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_MONO10:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_MONO10_P:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_MONO10_PACKED:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_GR10:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_RG10:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_GB10:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_BG10:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_BG10_P:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_BG10_PACKED:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_GB10_P:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_GB10_PACKED:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_GR10_P:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_GR10_PACKED:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_RG10_P:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_RG10_PACKED:
emValidBits = GX_VALID_BIT_LIST.GX_BIT_2_9;
break;
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_MONO12:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_MONO12_P:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_MONO12_PACKED:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_GR12:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_RG12:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_GB12:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_BG12:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_BG12_P:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_BG12_PACKED:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_GB12_P:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_GB12_PACKED:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_GR12_P:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_GR12_PACKED:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_RG12_P:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_RG12_PACKED:
emValidBits = GX_VALID_BIT_LIST.GX_BIT_4_11;
break;
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_MONO14:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_GR14:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_RG14:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_GB14:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_BG14:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_BG14_P:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_GB14_P:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_GR14_P:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_RG14_P:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_MONO14_P:
emValidBits = GX_VALID_BIT_LIST.GX_BIT_6_13;
break;
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_MONO16:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_GR16:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_RG16:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_GB16:
case GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_BG16:
emValidBits = GX_VALID_BIT_LIST.GX_BIT_8_15;
break;
default:
break;
}
return emValidBits;
}
private bool __IsPixelFormat8(GX_PIXEL_FORMAT_ENTRY emPixelFormatEntry)
{
const uint PIXEL_FORMATE_BIT = 0x00FF0000;
const uint GX_PIXEL_8BIT = 0x00080000;
bool bIsPixelFormat8 = false;
uint uiPixelFormatEntry = (uint)emPixelFormatEntry;
if ((uiPixelFormatEntry & PIXEL_FORMATE_BIT) == GX_PIXEL_8BIT)
{
bIsPixelFormat8 = true;
}
return bIsPixelFormat8;
}
public GenImage ConvertImage(UInt32 nWidth, UInt32 nHeight, IntPtr pImageBuf, GX_PIXEL_FORMAT_ENTRY enPixelType)
{
try
{
if (enPixelType == GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_MONO8)
{
return GenImage.FromIntPtr((int)nWidth, (int)nHeight, PixelType.Grey8, pImageBuf, (int)nWidth);
}
else
{
return GenImage.FromIntPtr((int)nWidth, (int)nHeight, PixelType.BGR24, pImageBuf, (int)nWidth * 3);
}
}
catch (System.Exception)
{
return null;
}
}
#endregion
}
#region Galaxy SDK 辅助类
internal class CWin32Bitmaps
{
[StructLayout(LayoutKind.Sequential)]
public struct BITMAPFILEHEADER
{
public ushort bfType;
public int bfSize;
public ushort bfReserved1;
public ushort bfReserved2;
public uint bfOffBits;
}
[StructLayout(LayoutKind.Sequential)]
public struct BITMAPINFOHEADER
{
public uint biSize;
public int biWidth;
public int biHeight;
public ushort biPlanes;
public ushort biBitCount;
public uint biCompression;
public int biSizeImage;
public int biXPelsPerMeter;
public int biYPelsPerMeter;
public uint biClrUsed;
public uint biClrImportant;
}
[StructLayout(LayoutKind.Sequential)]
public struct RGBQUAD
{
public byte rgbBlue;
public byte rgbGreen;
public byte rgbRed;
public byte rgbReserved;
}
[StructLayout(LayoutKind.Sequential)]
public struct BITMAPINFO
{
public BITMAPINFOHEADER bmiHeader;
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 256)]
public RGBQUAD[] bmiColors;
}
}
internal static class CDecide
{
public const uint GVSP_PIX_MONO = 0x01000000;
public const uint GVSP_PIX_RGB = 0x02000000;
public const uint GVSP_PIX_CUSTOM = 0x80000000;
public const uint GVSP_PIX_COLOR_MASK = 0xFF000000;
public const uint GVSP_PIX_ID_MASK = 0x0000FFFF;
public static bool GetISMono(uint nPixelFormat)
{
return ((GVSP_PIX_COLOR_MASK & nPixelFormat) == GVSP_PIX_MONO);
}
public static bool GetIsBayer(uint nPixelFormat)
{
bool bIsBayer = (((GVSP_PIX_ID_MASK & (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_GR8) <= (GVSP_PIX_ID_MASK & nPixelFormat)
&& (GVSP_PIX_ID_MASK & nPixelFormat) <= (GVSP_PIX_ID_MASK & (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_BG12))
|| ((GVSP_PIX_ID_MASK & (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_GR14) <= (GVSP_PIX_ID_MASK & nPixelFormat)
&& (GVSP_PIX_ID_MASK & nPixelFormat) <= (GVSP_PIX_ID_MASK & (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_BG14))
|| ((GVSP_PIX_ID_MASK & (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_GR16) <= (GVSP_PIX_ID_MASK & nPixelFormat)
&& (GVSP_PIX_ID_MASK & nPixelFormat) <= (GVSP_PIX_ID_MASK & (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_BG16)));
return bIsBayer;
}
public static bool GetIsRGB(uint nPixelFormat)
{
return ((GVSP_PIX_COLOR_MASK & nPixelFormat) == GVSP_PIX_RGB);
}
public static bool GetIsRGB8(uint nPixelFormat)
{
return ((nPixelFormat == (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_RGB8)
|| (nPixelFormat == (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BGR8));
}
public static bool GetIsGray(uint nPixelFormat)
{
return (GetISMono(nPixelFormat)) && (!GetIsBayer(nPixelFormat)) && (!GetIsRGB(nPixelFormat));
}
public static void GetConvertPixelFormat(String strPixelFormat, ref uint nPixelFormatValue)
{
switch (strPixelFormat)
{
case "Mono8": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_MONO8; break;
case "BayerRG8": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_RG8; break;
case "BayerGB8": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_GB8; break;
case "BayerGR8": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_GR8; break;
case "BayerBG8": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_BG8; break;
case "RGB8": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_RGB8; break;
case "BGR8": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BGR8; break;
case "Mono10": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_MONO10; break;
case "Mono10_Packed": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_MONO10_PACKED; break;
case "Mono10_P": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_MONO10_P; break;
case "BayerRG10": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_RG10; break;
case "BayerRG10_P": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_RG10_P; break;
case "BayerRG10_Packet": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_RG10_PACKED; break;
case "BayerGB10": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_GB10; break;
case "BayerGB10_P": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_GB10_P; break;
case "BayerGB10_Packet": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_GB10_PACKED; break;
case "BayerGR10": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_GR10; break;
case "BayerGR10_P": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_GR10_P; break;
case "BayerGR10_Packet": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_GR10_PACKED; break;
case "BayerBG10": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_BG10; break;
case "BayerBG10_P": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_BG10_P; break;
case "BayerBG10_Packet": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_BG10_PACKED; break;
case "Mono12": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_MONO12; break;
case "Mono12_Packed": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_MONO12_PACKED; break;
case "Mono12_P": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_MONO12_P; break;
case "BayerRG12": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_RG12; break;
case "BayerRG12_P": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_RG12_P; break;
case "BayerRG12_Packet": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_RG12_PACKED; break;
case "BayerGB12": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_GB12; break;
case "BayerGB12_P": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_GB12_P; break;
case "BayerGB12_Packet": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_GB12_PACKED; break;
case "BayerGR12": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_GR12; break;
case "BayerGR12_P": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_GR12_P; break;
case "BayerGR12_Packet": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_GR12_PACKED; break;
case "BayerBG12": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_BG12; break;
case "BayerBG12_P": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_BG12_P; break;
case "BayerBG12_Packet": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_BG12_PACKED; break;
case "Mono14": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_MONO14; break;
case "Mono14_P": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_MONO14_P; break;
case "BayerGR14": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_GR14; break;
case "BayerRG14": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_RG14; break;
case "BayerGB14": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_GB14; break;
case "BayerBG14": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_BG14; break;
case "BayerGR14_P": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_GR14_P; break;
case "BayerRG14_P": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_RG14_P; break;
case "BayerGB14_P": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_GB14_P; break;
case "BayerBG14_P": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_BG14_P; break;
case "Mono16": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_MONO16; break;
case "BayerGR16": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_GR16; break;
case "BayerRG16": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_RG16; break;
case "BayerGB16": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_GB16; break;
case "BayerBG16": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_BAYER_BG16; break;
case "R8": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_R8; break;
case "G8": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_G8; break;
case "B8": nPixelFormatValue = (uint)GX_PIXEL_FORMAT_ENTRY.GX_PIXEL_FORMAT_B8; break;
default: break;
}
}
}
#endregion
}