Search code examples
windows-runtimeimage-resizingwriteablebitmapex

WriteableBitmapEx Resize function in WInRT


I try to write function that will be resize images. I use WriteableBitmapEx for WinRT/Win8 function Resize();

public class PictureExtension 
{
    private MemoryRandomAccessStream _memoryRandomAccessStream;
    private readonly Stream _dataStream;
    private readonly double _height;
    private readonly double _width;

    public PictureExtension(Stream dataStream, double height, double width)
    {
        _dataStream = dataStream;
        _memoryRandomAccessStream = (_dataStream.ToRandomAccessStream());
        _height = height;
        _width = width;
    }

    public byte[] ToArray(double maxSide)
    {
        if (_height <= maxSide && _width <= maxSide)
        {
            return _dataStream.ToArray();
        }
        else
        {
            var target = new WriteableBitmap((int) _width, (int) _height);

            var aspectRatio = (double)_width / _height;
            double newHeight;
            double newWidth;
            if (_width > _height)
            {
                newWidth = maxSide;
                newHeight = newWidth / aspectRatio;
            }
            else
            {
                newHeight = maxSide;
                newWidth = maxSide * aspectRatio;
            }

            int count = (int)_dataStream.Length;

            using (var bmpStream = target.PixelBuffer.AsStream())
            {
                bmpStream.Seek(0, SeekOrigin.Begin);
                bmpStream.Write(_dataStream.ToArray(), 0, _dataStream.ToArray().Length);
            }


            var resized = target.Resize((int)newWidth, (int)newHeight, WriteableBitmapExtensions.Interpolation.Bilinear);

            return resized.ToByteArray();

        }

    }
}

}

This function return array of byte but it is not image any more.. I tested with PNG and JPG formats.. What's wrong?


Solution

  • I've been examining this problem before, try the code in this thread:
    How to resize Image in C# WinRT/winmd?