将PictureBox图像转换为位图

时间:2015-11-05 06:17:33

标签: c#

我正在使用指纹模块,并能够在图片框(C#)中捕获和显示输出。现在picture.Image即使图片框显示图像也是null。所以我试图将图片框图像保存为bmp,然后将bmp分配给同一个图片框,以便Picturebox.image不为null。

以下是代码:

Bitmap bmp = new Bitmap(picFP.width, picFP.height);
picFP.DrawToBitmap(bmp, picFP.ClientRectangle);

bmp.Save("path", Imageformat.bmp);
picFP.image = bmp;

此处保存的位图图像为空白。可能是什么问题?

1 个答案:

答案 0 :(得分:1)

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只绘制< strong>表面,结果是非持久性

在这种情况下,补救措施是

  • 获取结果的屏幕截图,然后从中进行操作。 Here is a post向您展示如何通过屏幕截图获取控件..

  • 或者您可能想要检查Nitgen是否会直接绘制位图..

为此,您应该将其传递给PictureBox,而不是传递给Bitmap

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方法的情况下获得图像。