/// <summary> /// Transform image into Bgra8 image /// </summary> /// <param name="softwareBitmap">Input image to transform.</param> /// <param name="transformScanline">Method to map pixels in a scanline.</param> static unsafe SoftwareBitmap TransformBitmap(SoftwareBitmap softwareBitmap, TransformScanline transformScanline) { // XAML Image control only supports premultiplied Bgra8 format. var outputBitmap = new SoftwareBitmap(BitmapPixelFormat.Bgra8, softwareBitmap.PixelWidth, softwareBitmap.PixelHeight, BitmapAlphaMode.Premultiplied); using (var input = softwareBitmap.LockBuffer(BitmapBufferAccessMode.Read)) using (var output = outputBitmap.LockBuffer(BitmapBufferAccessMode.Write)) { // Get stride values to calculate buffer position for a given pixel x and y position. var inputStride = input.GetPlaneDescription(0).Stride; var outputStride = output.GetPlaneDescription(0).Stride; var pixelWidth = softwareBitmap.PixelWidth; var pixelHeight = softwareBitmap.PixelHeight; using (var outputReference = output.CreateReference()) using (var inputReference = input.CreateReference()) { ((IMemoryBufferByteAccess)inputReference).GetBuffer(out var inputBytes, out var inputCapacity); ((IMemoryBufferByteAccess)outputReference).GetBuffer(out var outputBytes, out var outputCapacity); // Iterate over all pixels and store converted value. for (var y = 0; y < pixelHeight; y++) { var inputRowBytes = inputBytes + y * inputStride; var outputRowBytes = outputBytes + y * outputStride; transformScanline(pixelWidth, inputRowBytes, outputRowBytes); } } } return(outputBitmap); }
/// <summary> /// Transform image into Bgra8 image using given transform method. /// </summary> /// <param name="softwareBitmap">Input image to transform.</param> /// <param name="transformScanline">Method to map pixels in a scanline.</param> private static unsafe void TransformBitmap( SoftwareBitmap inputBitmap, SoftwareBitmap outputBitmap, TransformScanline transformScanline) { using (var input = inputBitmap.LockBuffer(BitmapBufferAccessMode.Read)) using (var output = outputBitmap.LockBuffer(BitmapBufferAccessMode.Write)) { // Get stride values to calculate buffer position for a given pixel x and y position. int inputStride = input.GetPlaneDescription(0).Stride; int outputStride = output.GetPlaneDescription(0).Stride; int pixelWidth = inputBitmap.PixelWidth; int pixelHeight = inputBitmap.PixelHeight; using (var outputReference = output.CreateReference()) using (var inputReference = input.CreateReference()) { // Get input and output byte access buffers. byte *inputBytes; uint inputCapacity; ((IMemoryBufferByteAccess)inputReference).GetBuffer(out inputBytes, out inputCapacity); byte *outputBytes; uint outputCapacity; ((IMemoryBufferByteAccess)outputReference).GetBuffer(out outputBytes, out outputCapacity); // Iterate over all pixels and store converted value. for (int y = 0; y < pixelHeight; y++) { byte *inputRowBytes = inputBytes + y * inputStride; byte *outputRowBytes = outputBytes + y * outputStride; transformScanline(pixelWidth, inputRowBytes, outputRowBytes); } } } }
/// <summary> /// Transform image into Bgra8 image using given transform method. /// </summary> /// <param name="softwareBitmap">Input image to transform.</param> /// <param name="transformScanline">Method to map pixels in a scanline.</param> private static unsafe SoftwareBitmap TransformBitmap(SoftwareBitmap softwareBitmap, TransformScanline transformScanline) { // XAML Image control only supports premultiplied Bgra8 format. var outputBitmap = new SoftwareBitmap(BitmapPixelFormat.Bgra8, softwareBitmap.PixelWidth, softwareBitmap.PixelHeight, BitmapAlphaMode.Premultiplied); using (var input = softwareBitmap.LockBuffer(BitmapBufferAccessMode.Read)) using (var output = outputBitmap.LockBuffer(BitmapBufferAccessMode.Write)) { // Get stride values to calculate buffer position for a given pixel x and y position. int inputStride = input.GetPlaneDescription(0).Stride; int outputStride = output.GetPlaneDescription(0).Stride; int pixelWidth = softwareBitmap.PixelWidth; int pixelHeight = softwareBitmap.PixelHeight; using (var outputReference = output.CreateReference()) using (var inputReference = input.CreateReference()) { // Get input and output byte access buffers. byte* inputBytes; uint inputCapacity; ((IMemoryBufferByteAccess)inputReference).GetBuffer(out inputBytes, out inputCapacity); byte* outputBytes; uint outputCapacity; ((IMemoryBufferByteAccess)outputReference).GetBuffer(out outputBytes, out outputCapacity); // Iterate over all pixels and store converted value. for (int y = 0; y < pixelHeight; y++) { byte* inputRowBytes = inputBytes + y * inputStride; byte* outputRowBytes = outputBytes + y * outputStride; transformScanline(pixelWidth, inputRowBytes, outputRowBytes); } } } return outputBitmap; }
/// <summary> /// Transform image into Bgra8 image using given transform method. /// </summary> /// <param name="softwareBitmap">Input image to transform.</param> /// <param name="transformScanline">Method to map pixels in a scanline.</param> private static unsafe SoftwareBitmap TransformBitmap(SoftwareBitmap softwareBitmap, TransformScanline transformScanline) { var outputBitmap = new SoftwareBitmap(BitmapPixelFormat.Bgra8, softwareBitmap.PixelWidth, softwareBitmap.PixelHeight, BitmapAlphaMode.Premultiplied); using (var input = softwareBitmap.LockBuffer(BitmapBufferAccessMode.Read)) using (var output = outputBitmap.LockBuffer(BitmapBufferAccessMode.Write)) { int inputStride = input.GetPlaneDescription(0).Stride; int outputStride = output.GetPlaneDescription(0).Stride; int pixelWidth = softwareBitmap.PixelWidth; int pixelHeight = softwareBitmap.PixelHeight; using (var outputReference = output.CreateReference()) using (var inputReference = input.CreateReference()) { byte *inputBytes; uint inputCapacity; ((IMemoryBufferByteAccess)inputReference).GetBuffer(out inputBytes, out inputCapacity); byte *outputBytes; uint outputCapacity; ((IMemoryBufferByteAccess)outputReference).GetBuffer(out outputBytes, out outputCapacity); for (int y = 0; y < pixelHeight; y++) { byte *inputRowBytes = inputBytes + y * inputStride; byte *outputRowBytes = outputBytes + y * outputStride; transformScanline(pixelWidth, inputRowBytes, outputRowBytes); } } } return(outputBitmap); }