单击按钮时,我试图保存picEmployeeImage的图像。 PicEmployeeImage会传输视频,因此在按下照片时会将其保存到文件中。目前,当我尝试它时,它说"在GDI +"
中发生了一般性错误我该如何解决这个问题?
请帮助。
以下是代码:
public void TakePhoto()
{
Bitmap bm = new Bitmap(picEmployeeImage.Width, picEmployeeImage.Height);
bm = (Bitmap) picEmployeeImage.Image;
bm.Save(@"\Images\" + currentlySelectedId + ".bmp", ImageFormat.Bmp);
}
private void btnCaptureNewImage_Click(object sender, EventArgs e)
{
if (btnCaptureNewImage.Text == "Capture New Image")
{
VideoShow();
btnCaptureNewImage.Text = "Take Photo";
} else
{
TakePhoto();
btnCaptureNewImage.Text = "Capture New Image";
}
}
void VideoShow()
{
VideoCaptureDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice);
FinalVideoSource = new VideoCaptureDevice(VideoCaptureDevices[0].MonikerString);
FinalVideoSource.NewFrame += new NewFrameEventHandler(FinalVideoSource_NewFrame);
FinalVideoSource.Start();
}
void FinalVideoSource_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
image = (Bitmap)eventArgs.Frame.Clone();
image = CropBitmap(image, 150, 100, 300, 200);
picEmployeeImage.Image = image;
}
更新: 错误信息:
System.Runtime.InteropServices.ExternalException (0x80004005): A generic error occurred in GDI+.
at System.Drawing.Image.Save(String filename, ImageCodecInfo encoder, EncoderParameters encoderParams)
at System.Drawing.Image.Save(String filename, ImageFormat format)
at BusinessSoftware.frmLoginPage.TakePhoto() in C:\Users\....cs:line 721
at BusinessSoftware.frmLoginPage.btnCaptureNewImage_Click(Object sender, EventArgs e) in C:\Users\....cs:line 705
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
答案 0 :(得分:0)
这是因为GDI + Image类不是线程安全的。
创建一个新的位图图像并绘制您在此新Bitmap对象上捕获的图像并保存此新对象。代码如下:
var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14];
var i = arr.length;
var partLen = i / 3;
var parentArr = [],
temp = [];
function shuffle(array) {
var currentIndex = array.length,
temporaryValue, randomIndex;
// While there remain elements to shuffle...
while (0 !== currentIndex) {
// Pick a remaining element...
randomIndex = Math.floor(Math.random() * currentIndex);
currentIndex -= 1;
// And swap it with the current element.
temporaryValue = array[currentIndex];
array[currentIndex] = array[randomIndex];
array[randomIndex] = temporaryValue;
}
return array;
}
var shuffled = shuffle(arr);
while (i--) {
if (temp.length >= partLen) {
parentArr.unshift(temp);
temp = [];
}
temp.push(shuffled[i]);
}
if (temp.length) {
parentArr.unshift(temp);
temp = [];
}
console.log(JSON.stringify(parentArr, null, 4));
另外,我建议你在点击“拍照”按钮时停止FinalVideoSource
public void TakePhoto()
{
Bitmap bm = new Bitmap(picEmployeeImage.Width, picEmployeeImage.Height);
bm = (Bitmap)picEmployeeImage.Image;
Bitmap bmp = new Bitmap(bm.Width, bm.Height);
Graphics g = Graphics.FromImage(bmp);
g.DrawImage(bm, 0, 0, bmp.Width, bmp.Height);
bmp.Save(@"\Images\" + currentlySelectedId + ".bmp", ImageFormat.Bmp);
}
HTH。