Aforge.net Capture de l'Appareil photo & Enregistrer l'image dans le répertoire
tout le monde. J'ai été coincé ici à faire avec ce bug pendant des jours, mais je ne pouvais toujours pas le comprendre.
Mon avis: je pense que mon code a un problème que je n'ai pas détruire l'objet correctement après utilisation, (je ne suis pas très familier avec ces concepts de libérer des ressources, le filetage) .
J'ai eu ces code en prenant référence de ce que les gens ne sur youtube, mais en dépit de moi en train de faire exactement la même chose, mon code ne fonctionne pas très bien.
SITUATION:
J'ai deux zones de l'image, à gauche, on peut prendre des vidéo de moi, à droite prendre la capture d'écran, si vous appuyez sur button1 , vous pourrez commencer la vidéo, clone_button copie d'une image c'est à dire de prendre un instantané, et save_image devez l'enregistrer sur le chemin de référence, cependant, je reçois un générique erreur s'est produite dans GDI+, encore et encore, alors que je suis en train de l'enregistrer. Aussi, mon débogueur semblait devenir fou (c'est à dire pas réussi à mettre fin à l'vshost.exe ) une fois que j'ai exécuté ce programme, j'ai redémarrer l'ordinateur pour obtenir mon code fonctionne à nouveau, ce qui est désolant et frustrant.
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Drawing.Imaging;
//AForge.Video dll
using AForge.Video;
using AForge.Video.DirectShow;
using AForge.Imaging;
using AForge.Imaging.Filters;
using AForge;
namespace WebCameraCapture
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private FilterInfoCollection CaptureDevice; //list of webcam
private VideoCaptureDevice FinalFrame;
private void Form1_Load(object sender, EventArgs e)
{
CaptureDevice = new FilterInfoCollection(FilterCategory.VideoInputDevice);//constructor
foreach (FilterInfo Device in CaptureDevice)
{
comboBox1.Items.Add(Device.Name);
}
comboBox1.SelectedIndex = 0; //default
FinalFrame = new VideoCaptureDevice();
}
private void button1_Click(object sender, EventArgs e)
{
FinalFrame = new VideoCaptureDevice(CaptureDevice[comboBox1.SelectedIndex].MonikerString);//specified web cam and its filter moniker string
FinalFrame.NewFrame += new NewFrameEventHandler(FinalFrame_NewFrame);//click button event is fired,
FinalFrame.Start();
}
void FinalFrame_NewFrame(object sender, NewFrameEventArgs eventArgs) //must be void so that it can be accessed everywhere.
//New Frame Event Args is an constructor of a class
{
pictureBox1.Image = (Bitmap)eventArgs.Frame.Clone();//clone the bitmap
}
private void From1_CLosing(object sender, EventArgs e)
{
if (FinalFrame.IsRunning==true) FinalFrame.Stop();
}
private void save_Click(object sender, EventArgs e)
{
if (pictureBox2.Image != null)
{
Bitmap varBmp = new Bitmap(pictureBox2.Image);
Bitmap newBitmap = new Bitmap(varBmp);
varBmp.Dispose();
varBmp = null;
varBmp.Save(@"C:\a.png", ImageFormat.Png);
}
else
{ MessageBox.Show("null exception"); }
}
private void clone_Click(object sender, EventArgs e)
{
pictureBox2.Image = (Bitmap)pictureBox1.Image.Clone();
}
}
}
Tout AForge.net l'utilisateur pouvez APPUYEZ simplement sur le LIEN ci-dessous et de l'essayer. Merci!
OriginalL'auteur el psy Congroo | 2014-07-16
Vous devez vous connecter pour publier un commentaire.
Après avoir un oeil à votre code, pour moi, il semble que vous vous débarrasser de votre droit à l'image avant de l'enregistrer. Ce qui signifie que votre programme ne peut pas enregistrer l'image, parce qu'elle n'existe plus. En fait, il indique que vous avez essentiellement supprimé l'image capturée à deux reprises, une fois à disposer, le moment où vous vous définissez comme nulle.
Donc, si vous déplacez les deux segments de code après la sauvegarde, il convient de travail. Accordé sans l'aide d'une boîte de dialogue pour modifier le nom du fichier, vous allez sûrement recevoir une erreur, sauf si vous supprimez ce fichier après chaque fois qu'il a été créé.
Si vous ouvrez le gestionnaire des tâches, vous pouvez regarder la quantité de mémoire de votre programme de trempage.
L'élimination de la mémoire après que vous avez terminé de l'utiliser, donne au système.
Vous n'avez pas de disposer à l'intérieur de votre FinalFrame_NewFrame fil, de sorte que lorsque la caméra est la lecture des images,
vous devriez voir l'utilisation de la mémoire de continuer à monter jusqu'à ce que vous arrêtez le programme.
J'ai ajouté disposer de mon fils, de mettre de l'utilisation de la mémoire sous contrôle, mais maintenant je suis de débogage mon image de sauvegarde. Parce que je suis de l'élimination, je ne peux pas enregistrer l'image lol. Mon programme se termine en essayant de sauver un null fichier image et génère l'erreur approprié.
Je suis en utilisant un 2ème picurebox juste que vous êtes, mais en utilisant, par exemple, pbox2.image = pbox1.image, ne copie pas les données de la copie de l'emplacement de mémoire avec les données de l'image, alors quand j'ai jeter pbox1 pour libérer de la mémoire, les données de l'image disparaît avec l'emplacement de la mémoire.
OriginalL'auteur Chris