在UWP应用中对位图图像应用遮罩

3

我在我的应用程序中打开了一张图片,并使用以下代码获取图像的像素数据。

  using (IRandomAccessStream fileStreams = await file.OpenAsync(Windows.Storage.FileAccessMode.Read))
            {
                BitmapDecoder decoder = await BitmapDecoder.CreateAsync(fileStreams);
                BitmapTransform transform = new BitmapTransform()
                {
                    ScaledWidth = Convert.ToUInt32(bitmapImage.PixelWidth),
                    ScaledHeight = Convert.ToUInt32(bitmapImage.PixelHeight)
                };
                PixelDataProvider pixelData = await decoder.GetPixelDataAsync(
                    BitmapPixelFormat.Bgra8,
                    BitmapAlphaMode.Straight,
                    transform,
                    ExifOrientationMode.IgnoreExifOrientation,
                    ColorManagementMode.DoNotColorManage
               );

                byte[] sourcePixels = pixelData.DetachPixelData();                
            }

这里我有一组图像的所有像素数组。这个数组中的像素总数为(宽度*高度*4)。分析这个数组后,我发现索引号0、1、2和3包含第一个像素的红色、绿色、蓝色和alpha值,索引号4、5、6和7包含图像第二个像素的红色、绿色、蓝色和alpha值,以此类推。
现在我想把我的3x3滤波器应用到这张图片上,但是我该如何使用这个一维数组呢?如果我有图像的二维数组,我知道如何做。
目前,我有一个想法。
  1. 将红色像素存储在一个2D数组中,绿色在另一个数组中,以此类推。
  2. 对每个2D数组应用滤波器。
  3. 再次合并所有这些数组,以重新生成1-D数组并返回结果。
这是一个好的解决方案吗?如果有更好的解决方案,请帮帮我。
1个回答

3
如果您想在UWP中掩盖Bitmapimage,需要使用软件位图来获取图像的原始像素数据。首先,需要分离图像和掩码数据,并将其转换为BGRA格式的字节数组。然后,在此之后,需要使用不安全代码访问该位置以实现此目的。
创建一个接口。
[ComImport] [Guid("5B0D3235-4DBA-4D44-865E-8F1D0E4FD04D")] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] unsafe interface IMemoryBufferByteAccess { void GetBuffer(out byte* buffer, out uint capacity); }
使用以下片段更改/编辑软件位图像素。
创建软件位图。
softwareBitmap = new SoftwareBitmap(BitmapPixelFormat.Bgra8, 100, 100, BitmapAlphaMode.Premultiplied);
using (BitmapBuffer buffer = softwareBitmap.LockBuffer(BitmapBufferAccessMode.Write))
{
    using (var reference = buffer.CreateReference())
    {
        byte* dataInBytes;
        uint capacity;
        ((IMemoryBufferByteAccess)reference).GetBuffer(out dataInBytes, out capacity);

        // Fill-in the BGRA plane
        BitmapPlaneDescription bufferLayout = buffer.GetPlaneDescription(0);
        for (int i = 0; i < bufferLayout.Height; i++)
        {
            for (int j = 0; j < bufferLayout.Width; j++)
            {

                byte value = (byte)((float)j / bufferLayout.Width * 255);
                dataInBytes[bufferLayout.StartIndex + bufferLayout.Stride * i + 4 * j + 0] = value;
                dataInBytes[bufferLayout.StartIndex + bufferLayout.Stride * i + 4 * j + 1] = value;
                dataInBytes[bufferLayout.StartIndex + bufferLayout.Stride * i + 4 * j + 2] = value;
                dataInBytes[bufferLayout.StartIndex + bufferLayout.Stride * i + 4 * j + 3] = (byte)255;
            }
        }
    }
}

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