将相机图像渲染到WPF图像控件

3

我有一台uEye相机,每隔1000毫秒拍摄图像快照,并希望在WPF Image控件中呈现它们,就像这样:

 Bitmap MyBitmap;

// get geometry of uEye image buffer

int width = 0, height = 0, bitspp = 0, pitch = 0, bytespp = 0;

long imagesize = 0;

m_uEye.InquireImageMem(m_pCurMem, GetImageID(m_pCurMem), ref width, ref height, ref bitspp, ref pitch);

bytespp = (bitspp + 1) / 8;

imagesize = width * height * bytespp; // image size in bytes

// bulit a system bitmap
MyBitmap = new Bitmap(width, height, PixelFormat.Format24bppRgb);

// fill the system bitmap with the image data from the uEye SDK buffer
BitmapData bd = MyBitmap.LockBits(new Rectangle(0, 0, width, height), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
m_uEye.CopyImageMem(m_pCurMem, GetImageID(m_pCurMem), bd.Scan0);
MyBitmap.UnlockBits(bd);

我正在尝试以每秒1次的速率将这些位图放入Image控件中。我该如何让Bitmap出现在Image控件中,并在完成后立即处理它们,以留下最小的内存占用,成为一个好的程序员 :) ?
1个回答

4
这是我们常用的方式(对我来说,在不占用CPU(大约5%)的情况下,帧速率可达200fps):
    private WriteableBitmap PrepareForRendering(VideoBuffer videoBuffer) {
        PixelFormat pixelFormat;
        if (videoBuffer.pixelFormat == PixFrmt.rgb24) {
            pixelFormat = PixelFormats.Rgb24;
        } else if (videoBuffer.pixelFormat == PixFrmt.bgra32) {
            pixelFormat = PixelFormats.Bgra32;
        } else if (videoBuffer.pixelFormat == PixFrmt.bgr24) {
            pixelFormat = PixelFormats.Bgr24;
        } else {
            throw new Exception("unsupported pixel format");
        }
        var bitmap = new WriteableBitmap(
            videoBuffer.width, videoBuffer.height,
            96, 96,
            pixelFormat, null
        );
        _imgVIew.Source = bitmap;
        return bitmap;
    }

    private void DrawFrame(WriteableBitmap bitmap, VideoBuffer videoBuffer, double averangeFps) {
        VerifyAccess();
        if (isPaused) {
            return;
        }

        bitmap.Lock();
        try {
            using (var ptr = videoBuffer.Lock()) {
                bitmap.WritePixels(
                    new Int32Rect(0, 0, videoBuffer.width, videoBuffer.height),
                    ptr.value, videoBuffer.size, videoBuffer.stride,
                    0, 0
                );
            }
        } finally {
            bitmap.Unlock();
        }
        fpsCaption.Text = averangeFps.ToString("F1");
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接