网络摄像头图像与打印图像不同

Webcam image differ from printed image

我正在忙一个C#的winform软件。我使用网络摄像头拍摄显示在 pictureBox 中的照片。

当我用网络摄像头拍摄图像时,它拍摄的是放大的图像,而打印时,它是拉伸的图像。我尝试了多种SizeMode settings.All 给出相同的结果

因为我不确定问题出在哪里,所以我将尽可能详细地包括在内:

使用

using AForge.Video;
using AForge.Video.DirectShow;

选择相机:

webcam = new FilterInfoCollection(FilterCategory.VideoInputDevice);
            foreach (FilterInfo VideoCaptureDevice in webcam)
            {
                cmbVideoList.Items.Add(VideoCaptureDevice.Name);
            }

使用相机(btn 点击):

cam = new VideoCaptureDevice(webcam[cmbVideoList.SelectedIndex].MonikerString);
        cam.NewFrame += new NewFrameEventHandler(cam_NewFrame);
        cam.Start();
        if (cam.IsRunning)
        {
            btnStart.Hide();
        }
        btnStop.Show();

    }
    void cam_NewFrame(object sender, NewFrameEventArgs eventArgs)
    {
        Bitmap bit = (Bitmap)eventArgs.Frame.Clone();
        pboxPhoto.Image = bit;
    }

图片框大小:

宽度:226

身高:328

打印代码:

 PictureBox pict = (PictureBox)pboxPhoto;
        pict.SizeMode = PictureBoxSizeMode.Zoom;
        e.Graphics.DrawImage(pict.Image, 20, 416, 305, 328);

这是软件上的图像示例: enter image description here

打印图像示例。 enter image description here

最简单的方法是告诉 PictureBox 将自己绘制到 Bitmap

这可以用所有 Controls 完成,结果将不仅包括 Image,可能还包括 BackgroundImage,还包括在 Paint 事件中绘制的所有内容作为任何嵌套 Controls.

这是一个简单的例子:

Size sz = pictureBox1.ClientSize;
using (Bitmap bmp = new Bitmap(sz.Width, sz.Height))
{
    pictureBox1.DrawToBitmap(bmp, pictureBox1.ClientRectangle);
    // save the image..
    bmp.Save(yourfilepath, ImageFormat.Png);
    // ..or print it!
}

一些注意事项:

  • 由于 using 子句,Bitmap 在最后一个卷曲之后得到 disposed,因此您可以在范围内使用它或更改到稍后处理 Bitmap 的模式。

  • 嵌套的Controls会按顺序绘制,如果重叠会出问题!

  • 只会包含 nested,不会包含 overlayed Controls。由于 PictureBox 不是 Container(与 Panel 相对),所以不能简单地在上面放置一个,比如 Label;相反,您需要将其嵌套在代码中,即将 PictureBox 设置为 Parent 并设置合适的相对值 Location..

  • 默认情况下 Bitmap 将具有当前机器屏幕的 dpi 分辨率。之后你冷改变它 bmp.SetResolution()..