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); } } } }
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); } }
/// <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)}"); }
/// <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); }
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); }
/// <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); } }
/// <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()); }
public WebP() { //Imazen.WebP.Extern.LoadLibrary.LoadWebPOrFail(); e = new SimpleEncoder(); d = new SimpleDecoder(); }