Example #1
0
        /// <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);
        }
Example #2
0
        /// <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;
        }
Example #4
0
        /// <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);
        }