PictureBox в растровое изображение или изображение? - PullRequest
1 голос
/ 08 апреля 2011

Я пытаюсь изменить код http://sites.google.com/site/webcamlibrarydotnet/winfrom-and-csharp-sample-code-and-download с графического блока на изображение или растровое изображение, поскольку я не хочу отображать какое-либо изображение или план для отображения, все, что я хочу, - это выводить изображение в файл.

Я попытался изменить webcam.cs с PictureBox _FrameImage на Bitmap _FrameImage и PictureBox ImageControl на Bitmap ImageControl и привести (Bitmap) к e.WebCamImage

А также изменение его в основной форме:

private void bWebcam_Click(object sender, EventArgs e)
{
    WebCam webcam = new WebCam();
    Bitmap image = null;
    webcam.InitializeWebCam(ref image);

    webcam.Start();
    webcam.Stop();

    FileStream fstream = new FileStream("testWebcam.jpg", FileMode.Create);
    image.Save(fstream, System.Drawing.Imaging.ImageFormat.Jpeg);
    fstream.Close();
}
  • К сожалению, это не похоже на работу как я могу изменить это с картинки поле для растрового изображения или изображения или аналогичного хранение перед сохранением в файл или сохранить его в файл напрямую?

Исходный код, который я использую: http://sites.google.com/site/webcamlibrarydotnet/winfrom-and-csharp-sample-code-and-download

Ответы [ 3 ]

2 голосов
/ 08 апреля 2011

Вместо использования класса WebCam, почему бы просто не использовать класс WebCamCapture напрямую (поскольку вы не отображаете его в форме) и напрямую обрабатывать событие ImageCapture. Аргумент события для события содержит Image. Вы можете в обработчике событий сохранить изображение на диск. С другой стороны, если вы хотите использовать образец и класс WebCam, и у вас есть форма. Используйте PictureBox, но оставьте его скрытым (установите для Visible значение false), а затем просто скопируйте изображение оттуда и сохраните на диск, когда вам нужно.

Вот пример кода использования класса WebCamCapture вместо класса WebCam. Следует отметить, что этот код основан на примере кода по ссылке, приведенной в вопросе. Я сохранил стиль примера, чтобы код выровнялся.

Редактировать: Добавление примера использования WebCamCapture вместо класса WebCam. Этот код должен использоваться для изменения Form1.cs в примере кода.

// Instead of having WebCam as member variable, have WemCamCapture
WebCamCapture webCam;

// Change the mainWinForm_Load function
private void mainWinForm_Load(object sender, EventArgs e)
{
    webCam = new WebCamCapture();
    webCam.FrameNumber = ((ulong)(0ul));
    webCam.TimeToCapture_milliseconds = 30;
    webCam.ImageCaptured += webcam_ImageCaptured;
}

// Add the webcam Image Captured handler to the main form
private void webcam_ImageCaptured(object source, WebcamEventArgs e)
{
    Image imageCaptured = e.WebCamImage;
    // You can now stop the camera if you only want 1 image
    // webCam.Stop();
    // Add code here to save image to disk
}

// Adjust the code in bntStart_Click
// (yes I know there is a type there, but to make code lineup I am not fixing it)
private void bntStart_Click(object sender, Event Args e)
{
    webCam.Start(0);
}
1 голос
/ 08 апреля 2011

Используя рефлектор, вы можете видеть, что внутри класса WebCam используется таймер для имитации частоты кадров.Поэтому вызов start и stop сразу после друг друга никогда не сгенерирует изображение, поскольку приложение не обрабатывает события приложения (и, следовательно, событие отметки времени) между запуском и остановкой.Вам нужно зарегистрироваться на событие ImageChanged и там остановиться.

Удачи

** Правка: логика запуска **

public void Start(ulong FrameNum)
{
    try
    {
        this.Stop();
        this.mCapHwnd = capCreateCaptureWindowA("WebCap", 0, 0, 0, this.m_Width, this.m_Height, base.Handle.ToInt32(), 0);
        Application.DoEvents();
        SendMessage(this.mCapHwnd, 0x40a, 0, 0);
        SendMessage(this.mCapHwnd, 0x432, 0, 0);
        this.m_FrameNumber = FrameNum;
        this.timer1.Interval = this.m_TimeToCapture_milliseconds;
        this.bStopped = false;
        this.timer1.Start();
    }
    catch (Exception exception)
    {
        MessageBox.Show("An error ocurred while starting the video capture. Check that your webcamera is connected properly and turned on.\r\n\n" + exception.Message);
        this.Stop();
    }
}
0 голосов
/ 08 апреля 2011

В WebCam.cs у вас есть:

public void InitializeWebCam(ref System.Windows.Forms.PictureBox ImageControl)
{
    webcam = new WebCamCapture();
    webcam.FrameNumber = ((ulong)(0ul));
    webcam.TimeToCapture_milliseconds = FrameNumber;
    webcam.ImageCaptured += new WebCamCapture.WebCamEventHandler(webcam_ImageCaptured);
    _FrameImage = ImageControl;
}
void webcam_ImageCaptured(object source, WebcamEventArgs e)
{
    _FrameImage.Image = e.WebCamImage;
}

Если вы измените код ImageCaptured , вы можете делать то, что вы хотите: e.WebCamImage - это изображение.
например, вы можете изменить / добавить конструктор для принятия имени файла, а в событии ImageCaptured вы можете сохранить изображение в файл.

...