2016-04-29 104 views
2

我想将自己的自定义效果应用于图片,因此我需要能够访问图像的各个像素。使用MediaCapture我可以将CapturedPhoto.Frame作为流或软件位图获取,但我无法找到我如何编辑它们。如何从捕获的图像访问/编辑像素C#

//initialize mediacapture with default camera 
var mediaCapture = new MediaCapture(); 
await mediaCapture.InitializeAsync(); 

//create low lag capture and take photo 
var lowLagCapture = await mediaCapture.PrepareLowLagPhotoCaptureAsync(ImageEncodingProperties.CreateUncompressed(MediaPixelFormat.Bgra8)); 
var capturedPhoto = await lowLagCapture.CaptureAsync(); 

capturedPhoto.Frame.AsStream() 
capturedPhoto.Frame.SoftwareBitmap 

回答

3

要访问图像的像素,您可以使用SoftwareBitmap。要访问RGB颜色空间中的像素,您可以使用Bgra8颜色格式。要转换到Bgra8使用

var softwareBitmap = SoftwareBitmap.Convert(capturedPhoto.Frame.SoftwareBitmap, BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied); 

要访问的图像,你需要通过命名空间

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

下一页中添加以下代码初始化IMemoryBufferByteAccess COM接口,你将需要设置字节不安全的编译器标志。右键单击项目 - >属性 - >生成 - >选中允许不安全的代码。

现在您可以直接访问/编辑像素,如下所示。

public unsafe void editSoftwarebitmap(SoftwareBitmap softwareBitmap) 
{ 
    //create buffer 
    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++) 
       { 
        //get offset of the current pixel 
        var pixelStart = bufferLayout.StartIndex + bufferLayout.Stride * i + 4 * j; 

        //get gradient value to set for blue green and red 
        byte value = (byte)((float)j/bufferLayout.Width * 255); 
        dataInBytes[pixelStart + 0] = value; //Blue 
        dataInBytes[pixelStart + 1] = value; //Green 
        dataInBytes[pixelStart + 2] = value; //Red 
        dataInBytes[pixelStart + 3] = (byte)255; //Alpha 
       } 
      } 
     } 
    } 
} 

有关更多文档,请参阅Imaging How-To

+0

对不起,但你能解释一下这个:dataInBytes,我们可以得到该图像的指针地址(该图像的起始字节进行编辑) –