C # PictureBox.SizeMode = Zoom не перерисовывается при назначении новых изображений - PullRequest
0 голосов
/ 07 марта 2019

Я работаю над проектом CCTV, в котором используется ONVIF. Я использую пример Winform, предоставленный проектом «ONVIF Device Manager», для получения видеокадров с камеры. (Вы можете найти это здесь ) Все работало нормально, если я подключился к одной камере. Но, если я подключаюсь к шести камерам, некоторые графические окна не перерисовываются при назначении новых изображений в DrawFrame (). Два задних прямоугольника содержат красный эллипс на прикрепленном рисунке, который должен отображать изображение. Эта проблема возникает только в том случае, если в качестве размера окна изображения выбран Zoom. Как и то, что я пробовал, эти графические блоки могут перерисовываться, только если я вызываю Application.DoEvent () или вызываю PictureBox.Update () / Refresh () каждый раз, когда я устанавливаю новое изображение.

Два красных эллипса на прикрепленном рисунке должны отображать изображение

private void DrawFrame(VideoBuffer videoBuffer, PlaybackStatistics statistics)
{
    Bitmap bmp = img as Bitmap;
    BitmapData bd = null;
    try
    {
        bd = bmp.LockBits(new System.Drawing.Rectangle(0, 0, bmp.Width, bmp.Height), System.Drawing.Imaging.ImageLockMode.WriteOnly, System.Drawing.Imaging.PixelFormat.Format32bppArgb);//bgra32

        using (var md = videoBuffer.Lock())
        {

            CopyMemory(bd.Scan0, md.value.scan0Ptr, videoBuff.stride * videoBuff.height);

            //bitmap.WritePixels(
            //    new Int32Rect(0, 0, videoBuffer.width, videoBuffer.height),
            //    md.value.scan0Ptr, videoBuffer.size, videoBuffer.stride,
            //    0, 0
            //);
        }

    }
    catch (Exception err)
    {
        //errBox.Text = err.Message;
        Debug.Print("DrawFrame:: " + err.Message);
    }
    finally
    {
        bmp.UnlockBits(bd);
    }
    imageBox.Image = bmp;
    /*Application.DoEvent() // not recommended since this method causes the current thread to be suspended
    or call imageBox.Update() // causes hanging on UI thread
    or imageBox.Refresh() // causes hanging on UI thread
    or PictureBox.Invalidate(), do nothing.*/
}

Я создаю графические блоки и добавляю на панель, следуя этому коду.

PictureBox ptBox = new PictureBox();
ptBox.Size = new Size(elementWidth, elementHeight);
ptBox.Name = "PictureBox_" + (j) + (i);
ptBox.Location = new Point(j * elementWidth, i * elementHeight); //relative location
ptBox.BorderStyle = BorderStyle.FixedSingle;
ptBox.SizeMode = PictureBoxSizeMode.Zoom;
mPanel.Controls.Add(ptBox);

Через неделю я обнаружил, что PictureBoxs происходит, ошибка не вызывает OnPaint (PaintEventArgs e) . Это приводит к ошибке, что новые изображения не перерисовываются.

...