Excel催化剂开源第35波-图片压缩及自动旋转等处理

2021-08-19 15:47:54 浏览数 (1)

Excel催化剂在图片处理方面,也是做到极致化,一般的Excel插件插入图片是原图插入或不可控制压缩比例地方式插入图片至Excel当中,但Excel催化剂的插入图片,是开发了可调节图片大小的插入方式,让图片在Excel上可以有预期的像素大小和文件大小的平衡。 在图片处理方面,完全可以借助一个非常棒的类库,实现美图秀秀那般日常的图片处理。

Excel催化剂在图片处理方式,使用了一个类库:ImageFactory,里面有非常丰富的图片处理功能,一点不输python的图片类库。

具体的详尽使用方式可参考官网:https://imageprocessor.org/imageprocessor/imagefactory/#example

它不止有桌面端的版本,也有web版,处理性能也很快,没有内存泄露问题。

google翻译官网介绍

代码调用非常优雅简洁,如下取自官网示例代码:

代码语言:javascript复制
byte[] photoBytes = File.ReadAllBytes(file);
// Format is automatically detected though can be changed.
ISupportedImageFormat format = new JpegFormat { Quality = 70 };
Size size = new Size(150, 0)
using (MemoryStream inStream = new MemoryStream(photoBytes))
{
    using (MemoryStream outStream = new MemoryStream())
    {
        // Initialize the ImageFactory using the overload to preserve EXIF metadata.
        using (ImageFactory imageFactory = new ImageFactory(preserveExifData:true))
        {
            // Load, resize, set the format and quality and save an image.
            imageFactory.Load(inStream)
                        .Resize(size)
                        .Format(format)
                        .Save(outStream);
        }
        // Do something with the stream.
    }
}

Excel催化剂使用的代码片段如下:

对图片的最长边进行控制,使用AutoRotate方法根据Exif信息旋转图片,再使用Resize方法进行调整大小,最后怕图片太大,用Quality方法压缩下。

因上层方法需要使用Image对象,不能在当前方法进行释放,对其进行Clone返回,不知道这样处理是否合理,有高手看到可以指教下。

代码语言:javascript复制
        public static Image GetImageByReduceSize(string filePath)
        {
            using (ImageFactory imageFactory = new ImageFactory())
            {
                var img = imageFactory.Load(filePath);
                img.AutoRotate();
                int picInsertSrcMaxPixed = Properties.Settings.Default.PicInsertSrcMaxPixed;

                Size orgSize = img.Image.Size;
                if (orgSize.Height > orgSize.Width)
                {
                    if (orgSize.Height > picInsertSrcMaxPixed)
                    {
                        img.Resize(new Size(0, picInsertSrcMaxPixed));
                    }
                }
                else
                {
                    if (orgSize.Width > picInsertSrcMaxPixed)
                    {
                        img.Resize(new Size(picInsertSrcMaxPixed, 0));
                    }
                }

               return (Image)img.Quality(70).Image.Clone();
            }
        }

0 人点赞