我使用的是指纹模块,能够捕获并在图片框(C#)中显示输出。现在图片。即使picturebox显示图像,图像也是空的。因此,我试图将picturebox图像保存为bmp,然后将该bmp分配给同一个picturebox,使picturebox.image不为空。
这是代码:
Bitmap bmp = new Bitmap(picFP.width, picFP.height);
picFP.DrawToBitmap(bmp, picFP.ClientRectangle);
bmp.Save("path", Imageformat.bmp);
picFP.image = bmp;
此处保存的位图图像为空白。问题出在哪里?
PictureBox
有三个层可以显示,PictureBox.DrawToBitmap
将把这三个东西都放入位图:
BackgroundImage
Image
- 在
Paint
事件中创建的任何图形
如果位图显示为黑色,则三个位图都没有,或者最后一个位图全是黑色。根据您的描述,您似乎可以在PictureBox
中显示图像。所以我假设你没有以正确的方式显示它,可能你是这样做的:
using (Graphics G = picFP.CreateGraphics())
G.DrawImage(yourCapturedImage, ..)
这将不起作用,因为它只会创建非持久性图形。这些会随着例如每个最小化恢复周期而消失,并且不会从DrawToBitmap
调用
如果你真的想把它画到PB的表面上,请使用Paint
事件!但更自然的选择是直接设置PB的图像:
picFP.Image = yourCapturedImage;
更新1正如您现在所揭示的,您自己不显示它,而是简单地将控制句柄赋予外部代码objNitgen=picFP.Handle;
,同样适用:Nitgen只将绘制到曲面上,结果是非持久性。
在这种情况下,补救措施是
将结果截屏,然后根据结果进行操作。这里有一篇文章向您展示了如何通过屏幕截图捕获控件。。
或者,您可能需要检查Nitgen是否会直接绘制位图。。
为此,您应该将其传递给Bitmap
,而不是PictureBox
的句柄:
private void button_Click(object sender, EventArgs e)
{
Bitmap bmp = new Bitmap(picFP.ClientSize.Width, picFP.ClientSize.Height);
Graphics G = Graphics.FromImage(bmp);
IntPtr dc= G.GetHdc();
objNitgen = dc;
objNitgen.capture();
G.ReleaseHdc(dc);
pictureBox1.Image = bmp; // now display..
bmp.Save(yourfilename); // .. and/or save
}
更新2
您在评论中指出,执行手动屏幕截图也不会捕获图像;因此,控制手柄似乎只是用来将其与图像叠加,就像视频叠加一样;如果是这种情况,我怀疑你是否可以在不使用其他更合适的Nitgen SDK方法的情况下获得图像。