private void TestLosslessRoundtrip(Bitmap gdiBitmap)
        {
            var encoder = new SimpleEncoder();
            var decoder = new SimpleDecoder();

            using (var outStream = new System.IO.MemoryStream())
            {
                encoder.Encode(gdiBitmap, outStream, -1);
                outStream.Close();

                var webpBytes = outStream.ToArray();
                var reloaded  = decoder.DecodeFromBytes(webpBytes, webpBytes.LongLength);

                Assert.Equal(gdiBitmap.Height, reloaded.Height);
                Assert.Equal(gdiBitmap.Width, reloaded.Width);

                for (var y = 0; y < reloaded.Height; y++)
                {
                    for (var x = 0; x < reloaded.Width; x++)
                    {
                        var expectedColor = gdiBitmap.GetPixel(x, y);
                        var actualColor   = reloaded.GetPixel(x, y);
                        Assert.Equal(expectedColor, actualColor);
                    }
                }
            }
        }
Beispiel #2
0
        private void ConvertWebpToPng(string name, bool isDeleteInputFile = true)
        {
            var stream  = File.Open($"{DownloadLocation}{name}.webp", FileMode.Open);
            var decoder = new SimpleDecoder();
            var bytes   = new byte[stream.Length];

            stream.Read(bytes, 0, bytes.Length);
            if (bytes.Length == 0)
            {
                stream.Dispose();
                File.Delete($"{DownloadLocation}{name}.webp");
                OnFailedDonwload?.Invoke();
                return;
            }
            var bmp = decoder.DecodeFromBytes(bytes, bytes.Length);

            bmp.Save($"{DownloadLocation}{name}.png", ImageFormat.Png);
            bmp.Dispose();
            stream.Dispose();

            if (isDeleteInputFile)
            {
                File.Delete($"{DownloadLocation}{name}.webp");
            }
        }
        public async Task <Texture2D> GetCoverImageTexture2DAsync(CancellationToken cancellationToken)
        {
            // Logger.Debug($"GetCoverImageTextre2DAsync() : {Source.Title}");
            try
            {
                var cachePath = Path.Combine(CoverFolder, $"{Source.Hash}.jpg");
                // キャッシュ利用
                if (File.Exists(cachePath))
                {
                    return(await Utils.GetTextureFromFileAsync(cachePath, cancellationToken));
                }

                if (!IsDownloadingCover)
                {
                    IsDownloadingCover = true;

                    var context = new DownloadContext($"{CoverUrlBase}{Source.Hash}.webp")
                    {
                        OnSuccess = (status, data) =>
                        {
                            // WebPはUnityで使えないので変換する
                            var decoder = new SimpleDecoder();
                            var bitmap  = decoder.DecodeFromBytes(data, data.Length);

                            // キャッシュ作成
                            bitmap.Save(cachePath, ImageFormat.Jpeg);

                            /*
                             * // Texture2Dを作成
                             * using (var stream = new MemoryStream())
                             * {
                             *  bitmap.Save(stream, bitmap.RawFormat);
                             *  var texture = new Texture2D(2, 2);
                             *  texture.LoadImage(stream.ToArray());
                             * }
                             */
                        },
                        OnError      = (_, __) => IsDownloadingCover = false,
                        OnCancelling = () => IsDownloadingCover = false,
                    };

                    WebRequestClient.Instance.EnqueueRequest(context);
                }

                return(await Utils.GetTextureFromResourceAsync(DefaultCoverResourceName, cancellationToken));
            }
            catch (Exception ex)
            {
                Logger.Debug("in GetCoverImageTexture2DAsync");
                Logger.Debug(ex);

                return(null);
            }
        }
Beispiel #4
0
        /// <summary>
        /// Декодируем WebP изображение
        /// </summary>
        /// <param name="fi">Информация о декодируемом файле</param>
        private void Decode(FileInfo fi)
        {
            //Инициализируем декодер
            SimpleDecoder decoder = new SimpleDecoder();

            //Считываем байты файла
            byte[] bytes = File.ReadAllBytes(fi.FullName);
            //Декодируем изображение
            using (Bitmap image = decoder.DecodeFromBytes(bytes, bytes.Length))
                //Сохраняем файл
                image.Save($"{savePath}{GenerateFileName(fi)}");
        }
Beispiel #5
0
        /// <summary>
        /// 从指向非托管内存空间的WebPData指针解码
        /// </summary>
        /// <param name="webPDataPointer"></param>
        /// <returns></returns>
        public WebPAnimation DecodeFromWebPDataPointer(IntPtr webPDataPointer)
        {
            //解调WebP数据以提取所有帧、ICC配置文件和EXIF / XMP元数据
            IntPtr demux = LibwebpdemuxUtils.WebPDemuxInternal(webPDataPointer, 0, IntPtr.Zero, Version);

            //创建迭代器,用来遍历动画的每一帧
            WebPIterator iter = new WebPIterator();
            //创建指向迭代器的指针
            IntPtr ptrIter = Marshal.AllocHGlobal(Marshal.SizeOf(iter));

            //给迭代器指针赋初值
            Marshal.StructureToPtr(iter, ptrIter, true);
            //初始化WebP动画结构体,这是本函数要返回的结果
            WebPAnimation animation = new WebPAnimation();

            //遍历所有帧
            if (LibwebpdemuxUtils.WebPDemuxGetFrame(demux, 1, ptrIter) != 0)
            {
                //如果成功获取了第一帧,就创建一个简单解码器
                SimpleDecoder simpleDecoder = new SimpleDecoder();
                do
                {
                    //解引用迭代器指针,恢复出迭代器对象
                    iter = Marshal.PtrToStructure <WebPIterator>(ptrIter);
                    //创建一个动画帧对象
                    WebPAnimationFrame frame = new WebPAnimationFrame();
                    //将迭代器中获得的数据存入动画帧对象中
                    frame.Complete = Convert.ToBoolean(iter.complete);
                    frame.Duration = iter.duration;
                    frame.HasAlpha = Convert.ToBoolean(iter.has_alpha);
                    frame.Height   = iter.height;
                    frame.Width    = iter.width;
                    frame.XOffset  = iter.x_offset;
                    frame.YOffset  = iter.y_offset;
                    frame.Image    = simpleDecoder.DecodeFromPointer(iter.fragment.bytes, (long)iter.fragment.size);
                    //将动画帧添加到动画对象中
                    animation.Frames.Add(frame);
                } while (LibwebpdemuxUtils.WebPDemuxNextFrame(ptrIter) != 0);
                //释放迭代器
                LibwebpdemuxUtils.WebPDemuxReleaseIterator(ptrIter);
            }
            //释放之前申请的非托管内存空间
            Marshal.FreeHGlobal(ptrIter);
            //指针置为0
            ptrIter = IntPtr.Zero;
            //返回动画对象
            return(animation);
        }
Beispiel #6
0
        public void TestDecSimple()
        {
            var decoder  = new SimpleDecoder();
            var fileName = "testimage.webp";
            var outFile  = "testimageout.jpg";

            File.Delete(outFile);
            FileStream outStream = new FileStream(outFile, FileMode.Create);

            using (Stream inputStream = System.IO.File.Open(fileName, System.IO.FileMode.Open))
            {
                var bytes     = ReadFully(inputStream);
                var outBitmap = decoder.DecodeFromBytes(bytes, bytes.LongLength);
                outBitmap.Save(outStream, System.Drawing.Imaging.ImageFormat.Jpeg);
                outStream.Close();
            }

            FileInfo finfo = new FileInfo(outFile);

            Assert.True(finfo.Exists);
        }
Beispiel #7
0
        /// <summary>
        /// 获取用户头像缩略图
        /// </summary>
        /// <param name="header"></param>
        /// <param name="width"></param>
        /// <param name="height"></param>
        /// <returns></returns>
        public BitmapImage GetHeaderThumbnail(string header, int width, int height)
        {
            if (header == null)
            {
                return(null);
            }

            try
            {
                Bitmap bitmap    = new Bitmap(header);
                Image  thumbnail = bitmap.GetThumbnailImage(width, height, null, IntPtr.Zero);

                return(StorageUtils.BitmapToBitmapImage(new Bitmap(thumbnail)));
            }
            catch (ArgumentException)
            {
                try
                {
                    SimpleDecoder simpleDecoder = new SimpleDecoder(header);
                    Bitmap        bitmap        = simpleDecoder.WebPtoBitmap();
                    Image         thumbnail     = bitmap.GetThumbnailImage(width, height, null, IntPtr.Zero);

                    return(StorageUtils.BitmapToBitmapImage(new Bitmap(thumbnail)));
                }
                catch (Exception ex)
                {
                    Utils.Debugging.Console.PrintLine("GetHeaderThumbnail()发生异常: {0}", ex);
                    LogManager.Error("StorageHeader.GetHeaderThumbnail()", ex);

                    return(null);
                }
            }
            catch (Exception e)
            {
                Utils.Debugging.Console.PrintLine("GetHeaderThumbnail()发生异常: {0}", e);
                LogManager.Error("StorageHeader.GetHeaderThumbnail()", e);

                return(null);
            }
        }
Beispiel #8
0
        /// <summary>
        /// Read non-animated WEBP format
        /// </summary>
        /// <param name="path"></param>
        /// <returns></returns>
        public static Bitmap ReadWebpFile(string path)
        {
            var webpDecoder = new SimpleDecoder();

            using (Stream inputStream = File.Open(path, FileMode.Open))
            {
                byte[] buffer = new byte[16 * 1024];
                using (MemoryStream ms = new MemoryStream())
                {
                    int read;
                    while ((read = inputStream.Read(buffer, 0, buffer.Length)) > 0)
                    {
                        ms.Write(buffer, 0, read);
                    }

                    var    bytes     = ms.ToArray();
                    Bitmap outBitmap = webpDecoder.DecodeFromBytes(bytes, bytes.LongLength);

                    return(outBitmap);
                }
            }
        }
 public void TestWebPVersions()
 {
     Imazen.WebP.Extern.LoadLibrary.LoadWebPOrFail();
     Assert.Equal("0.6.0", SimpleDecoder.GetDecoderVersion());
 }
Beispiel #10
0
 public WebP()
 {
     //Imazen.WebP.Extern.LoadLibrary.LoadWebPOrFail();
     e = new SimpleEncoder();
     d = new SimpleDecoder();
 }