Exemplo n.º 1
0
    static int Main(string[] args)
    {
        if (args.Length is < 1 or > 2)
        {
            Console.Error.WriteLine("Usage: webp-to-jpeg <input> [output]");
            return(1);
        }

        try
        {
            var inputFileName  = args[0];
            var outputFileName = args.Length > 1
                ? args[1]
                : Path.ChangeExtension(inputFileName, ".jpg");

            WebPExecuteDownloader.Download();

            var builder = new WebPDecoderBuilder();
            var decoder = builder.Build();

            using var output = File.Create(outputFileName);
            using var input  = File.OpenRead(inputFileName);
            decoder.Decode(input, output);
        }
        catch (Exception exception)
        {
            Console.Error.WriteLine($"Exception: {exception.Message}");
            return(1);
        }

        return(0);
    }
Exemplo n.º 2
0
        public void Compress(IServiceProvider serviceProvider, string srcFile, string dstFile)
        {
            var loggerFactory = (ILoggerFactory)serviceProvider.GetService(typeof(ILoggerFactory));
            var logger        = loggerFactory.CreateLogger("ImageToWebp");

            string tempfile = null;
            var    path     = Path.Combine(Path.GetFullPath("."), "webp");

            //根据当前系统平台下载google压缩工具
            if (Directory.Exists(path) == false)
            {
                logger.LogInformation("begin WebPExecuteDownloader.Download");
                WebPExecuteDownloader.Download();
                logger.LogInformation("end WebPExecuteDownloader.Download");
            }

            var builder = new WebPEncoderBuilder();

            var encoder = builder
                          .AlphaConfig(x => x // 透明处理
                                       .TransparentProcess(
                                           TransparentProcesses.Exact
                                           )
                                       )
                          .Build();
            var ext = Path.GetExtension(srcFile);

            if (string.Equals(ext, ".gif", StringComparison.CurrentCultureIgnoreCase))
            {
                //gif需要更改工具名称
                var type             = encoder.GetType();
                var fieldInfo        = type.GetField("_executeFilePath", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
                var _executeFilePath = (string)fieldInfo.GetValue(encoder).ToString().Replace("cwebp", "gif2webp");
                fieldInfo.SetValue(encoder, _executeFilePath);
                fieldInfo = type.GetField("_arguments", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
                fieldInfo.SetValue(encoder, "-q 70");
            }


            while (true)
            {
                try
                {
                    logger.LogInformation("build webp for " + dstFile);
                    using (var outputFile = File.Open(dstFile, FileMode.Create))
                        using (var inputFile = File.Open(srcFile, FileMode.Open))
                        {
                            encoder.Encode(inputFile, outputFile);
                        }
                    if (tempfile != null)
                    {
                        try
                        {
                            File.Delete(tempfile);
                        }
                        catch { }
                    }
                    break;
                }
                catch (Exception ex)
                {
                    logger.LogError(ex.ToString());

                    if (tempfile != null)
                    {
                        try
                        {
                            File.Delete(tempfile);
                        }
                        catch { }
                        tempfile = null;
                    }

                    if (ex.Message.Contains("16383"))
                    {
                        //图像太大,把分辨率转小
                        using (var bitmap = Bitmap.FromFile(srcFile))
                        {
                            int newwidth  = bitmap.Size.Width;
                            int newheight = bitmap.Size.Height;
                            if (newwidth > 16383)
                            {
                                newheight = (int)(newheight * (16383.0 / newwidth));
                                newwidth  = 16383;
                            }
                            if (newheight > 16383)
                            {
                                newwidth  = (int)(newwidth * (16383.0 / newheight));
                                newheight = 16383;
                            }
                            using (var newbitmap = new Bitmap(newwidth, newheight, bitmap.PixelFormat))
                            {
                                using (Graphics g = Graphics.FromImage(newbitmap))
                                {
                                    g.DrawImage(bitmap, new Rectangle(0, 0, newwidth, newheight), new Rectangle(Point.Empty, bitmap.Size), GraphicsUnit.Pixel);
                                }
                                var rawformat = bitmap.RawFormat;
                                bitmap.Dispose();
                                tempfile = dstFile + ".tmp.png";
                                while (System.IO.File.Exists(tempfile))
                                {
                                    tempfile = dstFile + DateTime.Now.ToString("yyyyMMddHHmmss") + ".tmp.png";
                                }
                                srcFile = tempfile;
                                newbitmap.Save(tempfile, rawformat);
                            }
                        }
                    }
                    else
                    {
                        break;
                    }
                }
            }
        }
 public WebPExecuteDownloadHelper()
 {
     WebPExecuteDownloader.Download();
 }