为什么在访问WriteableBitmap Image中的像素时会发生AccessViolationException?

时间:2016-03-01 15:58:44

标签: c# wpf writablebitmap

我有一个从相机到WPF中的图像的视频流。我想在显示之前逐个像素地访问WritableBitMap图像。作为测试,我试图将整个图像设置为白色或黑色。但是,在这两种情况下,我都收到了AccessViolationException错误。

我检查了其他帖子,似乎这个错误非常广泛,并不是我的具体情况。我似乎无法知道为什么我没有让这个工作。

那么在我的情况下使用像素的最佳方法是什么?或者为什么这不起作用?任何帮助表示赞赏

<?xml version="1.0" encoding="utf-8"?>
    <menu xmlns:android="http://schemas.android.com/apk/res/android"
      xmlns:app="http://schemas.android.com/apk/res-auto">
    <item
            android:id="@+id/menu_check"
            android:title="@string/done"
            app:showAsAction="always"/>

</menu>

2 个答案:

答案 0 :(得分:1)

你已经交换了X和Y,我代表高度,j代表宽度,那么你应该调用SetPixel,如:

temp.SetPixel(j, i, 255);

对于这样的情况,最好为变量使用有意义的名称,例如X和Y。

答案 1 :(得分:0)

我最后使用了this帖子的回答。我现在可以编辑任何WriteableBitmap图像的原始像素数据,然后再将其发送到WPF中的图像控件。下面是我使用的内容,但在这里我只是在条件下将每个帧转换为透明度:

        public void ConvertImage(ref WriteableBitmap Wbmp)
    {
        int width = Wbmp.PixelWidth;
        int height = Wbmp.PixelHeight;
        int stride = Wbmp.BackBufferStride;
        int bytesPerPixel = (Wbmp.Format.BitsPerPixel + 7) / 8;

        unsafe
        {
            byte* pImgData = (byte*)Wbmp.BackBuffer;

            // set alpha to transparent for any pixel with red < 0x88 and invert others
            int cRowStart = 0;
            int cColStart = 0;
            for (int row = 0; row < height; row++)
            {
                cColStart = cRowStart;
                for (int col = 0; col < width; col++)
                {
                    byte* bPixel = pImgData + cColStart;
                    UInt32* iPixel = (UInt32*)bPixel;

                    if (bPixel[2 /* bgRa */] < 0x44)
                    {
                        // set to 50% transparent
                        bPixel[3 /* bgrA */] = 0x7f;
                    }
                    else
                    {
                        // invert but maintain alpha
                        *iPixel = *iPixel ^ 0x00ffffff;
                    }

                    cColStart += bytesPerPixel;
                }
                cRowStart += stride;
            }
        }
    }

使用它的例程是这样的:

        masterImage.Lock();
        ConvertImage(ref masterImage);
        masterImage.AddDirtyRect(new Int32Rect(0, 0, masterImage.PixelWidth, masterImage.PixelHeight));
        masterImage.Unlock();