【问题标题】:Applying masks to bitmap image in UWP App在 UWP App 中对位图图像应用蒙版
【发布时间】:2016-07-14 02:25:27
【问题描述】:

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

  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();                
            }

在这里,我得到了图像所有像素的数组。该数组中的像素总数为(width * height * 4)。在分析了这个数组后,我知道索引号 0、1、2 和 3 包含第一个像素的红色、绿色、蓝色和 alpha 值,索引号 4、5、6 和 7 包含红色、绿色、蓝色和 alpha图像的第二个像素的值等等。

现在我想将我的 3x3 滤镜应用到这张图片上,我该如何使用这个一维数组呢?如果我有图像的二维数组,我知道该怎么做。

现在,我心里有一个想法。

  1. 将红色像素存储在一个二维数组中,绿色像素存储在另一个数组中,以此类推
  2. 对每个二维数组应用过滤器。
  3. 将所有这些组合起来再次创建一维数组并返回结果。

这是一个好的解决方案吗? 如果有更好的解决方案,请帮助我。

【问题讨论】:

    标签: c# image-processing bitmap win-universal-app


    【解决方案1】:

    如果您想在 UWP 中屏蔽位图图像,您需要使用软件位图来处理图像的原始像素数据。 首先,您需要将图像和掩码数据分离,并将其转换为 BGRA 格式的字节数组。 然后,您需要使用不安全的代码访问该位置来实现这一点。

    创建一个界面。

    [ComImport] [Guid("5B0D3235-4DBA-4D44-865E-8F1D0E4FD04D")] [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)] unsafe interface IMemoryBufferByteAccess { void GetBuffer(out byte* buffer, out uint capacity); }

    使用以下 sn-p 更改/编辑软件位图像素。

    创建软件位图。

    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;
                }
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2011-11-20
      • 2018-07-29
      • 2016-07-15
      • 2017-10-07
      • 2015-07-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-13
      相关资源
      最近更新 更多