操作WriteableBitmap像素

我试图合并两个图像作为WriteableBitmaps。 我想要将每个像素值平方,将其添加到其他图像,然后取第二根(如果值大于255,则检查+)。 由于我没有这么做,所以使用WriteableBitmapEx和ForEach()(Sobel算子和Convolution with WriteableBitmapEx)(它看起来很慢),我尝试使用BitmapDecoder直接操作像素。 不幸的是我似乎无法将Pixelstream写回WriteableBitmap,因为我得到错误:

'Windows.Storage.Streams.IBuffer'不包含'AsStream'的定义,并且最好的扩展方法重载'System.IO.WindowsRuntimeStreamExtensions.AsStream(Windows.Storage.Streams.IRandomAccessStream)'有一些无效参数

实例参数:无法从“Windows.Storage.Streams.IBuffer”转换为“Windows.Storage.Streams.IRandomAccessStream”

为这些线路

using (Stream stream = bmp.PixelBuffer.AsStream())
{
   await stream.WriteAsync(pixels1, 0, pixels1.Length);
}

可能这是WriteableBitmapEx库破坏的东西吗?

此外,我想知道如何让我的WriteableBitmaps进入BitmapDecoders。 我从Win8 Coding书中获取了这些代码。

以下是我的完整代码:

    async Task SobelCombine(BitmapDecoder decoder1, BitmapDecoder decoder2)
    {
        PixelDataProvider provider1 = await decoder1.GetPixelDataAsync(
            BitmapPixelFormat.Bgra8, BitmapAlphaMode.Straight, new BitmapTransform(),
            ExifOrientationMode.RespectExifOrientation, ColorManagementMode.ColorManageToSRgb);
        byte[] pixels1 = provider1.DetachPixelData();
        PixelDataProvider provider2 = await decoder1.GetPixelDataAsync(
            BitmapPixelFormat.Bgra8, BitmapAlphaMode.Straight, new BitmapTransform(),
            ExifOrientationMode.RespectExifOrientation, ColorManagementMode.ColorManageToSRgb);
        byte[] pixels2 = provider1.DetachPixelData();



        for (int i = 0; i < pixels1.Length; i += 4){
            pixels1[i]      = (byte)((byte)Math.Sqrt((Math.Pow(pixels1[i], 2) + Math.Pow(pixels2[i], 2))) % byte.MaxValue);
            pixels1[i + 1] =  (byte)((byte)Math.Sqrt((Math.Pow(pixels1[i + 1], 2) + Math.Pow(pixels2[i + 1], 2))) % byte.MaxValue);
            pixels1[i + 2] =  (byte)((byte)Math.Sqrt((Math.Pow(pixels1[i + 2], 2) + Math.Pow(pixels2[i + 2], 2))) % byte.MaxValue);
        }

        WriteableBitmap bmp = new WriteableBitmap((int)decoder1.OrientedPixelWidth, (int)decoder1.OrientedPixelHeight);

        using (Stream stream = bmp.PixelBuffer.AsStream())
        {
            await stream.WriteAsync(pixels1, 0, pixels1.Length);
        }

   } 

IBuffer.AsStream()是一种扩展方法。 如果你想使用它,你需要在其定义的地方包含命名空间:

using System.Runtime.InteropServices.WindowsRuntime;

更新:正如我在我的评论中提到的,我没有用可写位图做很多事情。 但是,您的代码不会设置透明度值。 这可能至少是问题的一部分:

for (int i = 0; i < pixels1.Length; i += 4){
    pixels1[i]      = (byte)((byte)Math.Sqrt((Math.Pow(pixels1[i], 2) + Math.Pow(pixels2[i], 2))) % byte.MaxValue);
    pixels1[i + 1] =  (byte)((byte)Math.Sqrt((Math.Pow(pixels1[i + 1], 2) + Math.Pow(pixels2[i + 1], 2))) % byte.MaxValue);
    pixels1[i + 2] =  (byte)((byte)Math.Sqrt((Math.Pow(pixels1[i + 2], 2) + Math.Pow(pixels2[i + 2], 2))) % byte.MaxValue);
}

应该:

for (int i = 0; i < pixels1.Length; i += 4){
    pixels1[i]      = (byte)((byte)Math.Sqrt((Math.Pow(pixels1[i], 2) + Math.Pow(pixels2[i], 2))) % byte.MaxValue);
    pixels1[i + 1] =  (byte)((byte)Math.Sqrt((Math.Pow(pixels1[i + 1], 2) + Math.Pow(pixels2[i + 1], 2))) % byte.MaxValue);
    pixels1[i + 2] =  (byte)((byte)Math.Sqrt((Math.Pow(pixels1[i + 2], 2) + Math.Pow(pixels2[i + 2], 2))) % byte.MaxValue);
    pixels1[i + 3] = 255; // or some combination of the source data. 0 == completely transparent.
}
链接地址: http://www.djcxy.com/p/26883.html

上一篇: Manipulate WriteableBitmap Pixels

下一篇: Changes to WriteableBitmap pixels don't update screen