网络摄像头图像与打印图像不同
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()
..
我正在忙一个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()
..