WindowsForm PictureBox.Image为null,即使表单中显示了图像

我正在尝试捕获此设备扫描的指纹 – > http://www.nitgen.com/eng/product/finkey.html

我能够扫描指纹并成功保存二进制数据。 我也可以在图片框中显示指纹。 但是,当我试图保存图片框中显示的指纹时,我收到一个错误,即图片框的图像为空。

下面是我的捕获指纹和从图片框保存图像的代码。

public class Form1 : System.Windows.Forms.Form { public NBioBSPCOMLib.NBioBSP objNBioBSP; public NBioBSPCOMLib.IExtraction objExtraction; private PictureBox pictureExtWnd; private void Form1_Load(object sender, System.EventArgs e) { // Create NBioBSP object objNBioBSP = new NBioBSPCOMLib.NBioBSPClass(); objExtraction = (NBioBSPCOMLib.IExtraction)objNBioBSP.Extraction; pictureExtWnd.Image = new Bitmap(pictureExtWnd.Width, pictureExtWnd.Height); } private void buttonEnroll_Click(object sender, System.EventArgs e) { //tell NBIO to not display their fingerprint scanning window objExtraction.WindowStyle = NBioBSPType.WINDOW_STYLE.INVISIBLE; //set the color of the fingerprint captured objExtraction.FPForeColor = "000000"; //set the color of the background where the fingerprint will be displayed objExtraction.FPBackColor = "FFFFFF"; //tell NBIO that the scanned fingerprint will be displayed in the picturebox //by giving the handle control to NBIO objExtraction.FingerWnd = pictureExtWnd.Handle.ToInt32(); //start scanning the fingerprint. This is also where the fingerprint //is displayed in the picturebox. objExtraction.Capture((int)NBioBSPType.FIR_PURPOSE.VERIFY); //if there's no problem while scanning the fingerprint, save the fingerprint image if (objExtraction.ErrorCode == NBioBSPError.NONE) { string fileName = RandomString.GetRandomString(16, true) + ".bmp"; using (SaveFileDialog sfdlg = new SaveFileDialog()) { sfdlg.Title = "Save Dialog"; sfdlg.Filter = "Bitmap Images (*.bmp)|*.bmp|All files(*.*)|*.*"; if (sfdlg.ShowDialog(this) == DialogResult.OK) { pictureExtWnd.Image.Save(sfdlg.FileName, ImageFormat.Bmp); MessageBox.Show("FingerPrint Saved Successfully."); } } } else { MessageBox.Show("FingerPrint Saving Failed!"); } } } 

我试过封闭在里面

 using(Graphics g = new Graphics) { objExtraction.Capture((int)NBioBSPType.FIR_PURPOSE.VERIFY); } 

因为我读过在对图像进行编辑时,你需要使用图形。 但是没有任何事情发生,因为api没有使用我实例化的图形对象。

更新:这是我最终做的事情:

 using (SaveFileDialog sfdlg = new SaveFileDialog()) { sfdlg.Title = "Save Dialog"; sfdlg.Filter = "Bitmap Images (*.bmp)|*.bmp|All files(*.*)|*.*"; if (sfdlg.ShowDialog(this) == DialogResult.OK) { Graphics gfx = this.pictureExtWnd.CreateGraphics(); Bitmap bmp = new Bitmap(this.pictureExtWnd.Width, this.pictureExtWnd.Height); this.pictureExtWnd.DrawToBitmap(bmp, new Rectangle(0, 0, this.pictureExtWnd.Width, this.pictureExtWnd.Height)); bmp.Save(sfdlg.FileName, ImageFormat.Bmp); gfx.Dispose(); //pictureExtWnd.Image.Save(sfdlg.FileName, ImageFormat.Bmp); MessageBox.Show("Saved Successfully..."); } } 

  objExtraction.FingerWnd = pictureExtWnd.Handle.ToInt32(); 

您将窗口句柄传递给指纹扫描仪。 这是告诉大量本机代码可以绘制的窗口的常用方法。 它通常会对窗口过程进行子类化以响应WM_PAINT请求,例如,与NativeWindow.WndProc()相同的想法。

然而暗示Image属性是无用的。 该本机代码不知道这是一个PictureBox控件,它有一个Image属性。 它只知道为控件创建的本机窗口。

请在api中查看保存图像的选项,这应该是可用的。 如果没有,那么你第一次保存就是使用图片框’DrawToBitmap()方法。 如果扫描程序实现WM_PRINT消息处理程序,则可能有效。 如果这不起作用,那么您唯一的其他备份计划是使用Graphics.CopyFromScreen()。 只要窗口在前台,这将始终有效。 与使用键盘上的PrtSc按钮类似,屏幕截图。