Exemple #1
0
        public override ImageData Read(IBinaryStream stream, ImageMetaData info)
        {
            var reader = new WebPDecoder(stream, (WebPMetaData)info);

            reader.Decode();
            return(ImageData.Create(info, reader.Format, null, reader.Output));
        }
Exemple #2
0
        public async Task <WriteableBitmap> GetImageFromUrl(string url)
        {
            var bytes = new HttpClient().GetByteArrayAsync(url).Result;
            // Create an instance of the decoder
            var webp = new WebPDecoder();
            // Decode to BGRA (Bitmaps use this format)
            var pixelData1 = await webp.DecodeBgraAsync(bytes);

            var pixelData = pixelData1.ToArray();
            // Get the size
            var size = await webp.GetSizeAsync(bytes);

            // With the size of the webp, create a WriteableBitmap
            var bitmap = new WriteableBitmap((int)size.Width, (int)size.Height);
            // Write the pixel data to the buffer
            var stream = bitmap.PixelBuffer.AsStream();
            await stream.WriteAsync(pixelData, 0, pixelData.Length);

            return(bitmap);
        }
        private static async void SourceCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            try
            {
                var image = d as Image;
                var imageBrush = d as ImageBrush;

                if (imageBrush == null && image == null) return;

                if (image != null) image.Source = null;
                else imageBrush.ImageSource = null;

                var url = (Uri) e.NewValue;

                if (url == null)
                {
                    return;
                }

                if (!url.OriginalString.Contains(".webp"))
                {
                    if (image != null) image.Source = new BitmapImage(url);
                    else imageBrush.ImageSource = new BitmapImage(url);
                    return;
                }
                if (url.OriginalString.StartsWith("ms-resource"))
                    url = new Uri(url.OriginalString.Replace("ms-resource:///Files/", "ms-appx:///"));

                var streamReference = RandomAccessStreamReference.CreateFromUri(url);
                ImageSource source;
                byte[] arr;
                
                using (var stream = (await streamReference.OpenReadAsync()).AsStreamForRead())
                {
                    arr = new byte[stream.Length];
                    await stream.ReadAsync(arr, 0, arr.Length);
                }
                
                try
                {
                    var webp = new WebPDecoder();
                    var size = await webp.GetSizeAsync(arr);
                    var pixelData = await webp.DecodeBgraAsync(arr);
                    var wb = new WriteableBitmap((int) size.Width, (int) size.Height);
                    var pixelArr = pixelData.ToArray();
                    
                    using (var pixelDataStream = wb.PixelBuffer.AsStream())
                    {
                        await pixelDataStream.WriteAsync(pixelArr, 0, pixelArr.Length);
                        source = wb;
                    }
                }
                catch
                {
                    using (var rnd = new MemoryStream(arr).AsRandomAccessStream())
                    {
                        var bitmap = new BitmapImage();
                        await bitmap.SetSourceAsync(rnd);

                        source = bitmap;
                    }
                }

                if (image != null) image.Source = source;
                else imageBrush.ImageSource = source;
            }
            catch (Exception ex)
            {
                Debug.WriteLine("Something happened opening webp image. Stack trace: " + ex.Message);
            }
        }
 /// <summary>
 /// Initializes a new instance of the <see cref="T:WebP.Touch.WebPCodec"/> class.
 /// </summary>
 public WebPCodec()
 {
     _decoder = new WebPDecoder();
 }
        private static async void SourceCallback(DependencyObject d, DependencyPropertyChangedEventArgs e)
        {
            try
            {
                var image      = d as Image;
                var imageBrush = d as ImageBrush;

                if (imageBrush == null && image == null)
                {
                    return;
                }

                if (image != null)
                {
                    image.Source = null;
                }
                else
                {
                    imageBrush.ImageSource = null;
                }

                var url = (Uri)e.NewValue;

                if (url == null)
                {
                    return;
                }

                if (!url.OriginalString.Contains(".webp"))
                {
                    if (image != null)
                    {
                        image.Source = new BitmapImage(url);
                    }
                    else
                    {
                        imageBrush.ImageSource = new BitmapImage(url);
                    }
                    return;
                }
                if (url.OriginalString.StartsWith("ms-resource"))
                {
                    url = new Uri(url.OriginalString.Replace("ms-resource:///Files/", "ms-appx:///"));
                }

                var         streamReference = RandomAccessStreamReference.CreateFromUri(url);
                ImageSource source;
                byte[]      arr;

                using (var stream = (await streamReference.OpenReadAsync()).AsStreamForRead())
                {
                    arr = new byte[stream.Length];
                    await stream.ReadAsync(arr, 0, arr.Length);
                }

                try
                {
                    var webp = new WebPDecoder();
                    var size = await webp.GetSizeAsync(arr);

                    var pixelData = await webp.DecodeBgraAsync(arr);

                    var wb       = new WriteableBitmap((int)size.Width, (int)size.Height);
                    var pixelArr = pixelData.ToArray();

                    using (var pixelDataStream = wb.PixelBuffer.AsStream())
                    {
                        await pixelDataStream.WriteAsync(pixelArr, 0, pixelArr.Length);

                        source = wb;
                    }
                }
                catch
                {
                    using (var rnd = new MemoryStream(arr).AsRandomAccessStream())
                    {
                        var bitmap = new BitmapImage();
                        await bitmap.SetSourceAsync(rnd);

                        source = bitmap;
                    }
                }

                if (image != null)
                {
                    image.Source = source;
                }
                else
                {
                    imageBrush.ImageSource = source;
                }
            }
            catch (Exception ex)
            {
                Debug.WriteLine("Something happened opening webp image. Stack trace: " + ex.Message);
            }
        }
        private static ImageSource DecodeWebPImage(string cacheKey, byte[] buffer, System.Action faultCallback = null)
        {
            try
            {
                WeakReference <WriteableBitmap> reference;
                if (_cachedWebPImages.TryGetValue(cacheKey, out reference))
                {
                    WriteableBitmap cachedBitmap;
                    if (reference.TryGetTarget(out cachedBitmap))
                    {
                        return(cachedBitmap);
                    }
                }

                var    decoder = new WebPDecoder();
                int    width = 0, height = 0;
                byte[] decoded = null;
                try
                {
                    decoded = decoder.DecodeRgbA(buffer, out width, out height);
                }
                catch (Exception ex)
                {
                    faultCallback.SafeInvoke();
                    // не получается сконвертировать, битый файл
                    //store.DeleteFile(documentLocalFileName);
                    Telegram.Api.Helpers.Execute.ShowDebugMessage("WebPDecoder.DecodeRgbA ex " + ex);
                }

                if (decoded == null)
                {
                    return(null);
                }

                var wb = new WriteableBitmap(width, height);
                for (var i = 0; i < decoded.Length / 4; i++)
                {
                    int r = decoded[4 * i];
                    int g = decoded[4 * i + 1];
                    int b = decoded[4 * i + 2];
                    int a = decoded[4 * i + 3];

                    a <<= 24;
                    r <<= 16;
                    g <<= 8;
                    int iPixel = a | r | g | b;

                    wb.Pixels[i] = iPixel;
                }

                _cachedWebPImages[cacheKey] = new WeakReference <WriteableBitmap>(wb);

                return(wb);
            }
            catch (Exception ex)
            {
                TLUtils.WriteException("WebPDecode ex ", ex);
            }

            return(null);
        }
 public async Task<WriteableBitmap> GetImageFromUrl(string url)
 {
     var bytes = new HttpClient().GetByteArrayAsync(url).Result;
     // Create an instance of the decoder
     var webp = new WebPDecoder();
     // Decode to BGRA (Bitmaps use this format)
     var pixelData1 = await webp.DecodeBgraAsync(bytes);
     var pixelData = pixelData1.ToArray();
     // Get the size
     var size = await webp.GetSizeAsync(bytes);
     // With the size of the webp, create a WriteableBitmap
     var bitmap = new WriteableBitmap((int)size.Width, (int)size.Height);
     // Write the pixel data to the buffer
     var stream = bitmap.PixelBuffer.AsStream();
     await stream.WriteAsync(pixelData, 0, pixelData.Length);
     return bitmap;
 }