将PictureBox图像转换为位图

本文关键字:位图 转换 图像 PictureBox | 更新日期: 2023-09-27 18:20:34

我使用的是指纹模块,能够捕获并在图片框(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三个层可以显示,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方法的情况下获得图像。