当前位置: 首页 > article >正文

C# 图片下载工具类

写在前面

从浏览器的Html文本中获取图片链接并保存到本地,同时对图片的分辨率和品质进行处理,以满足某些平台的规格需求;可以放到多线程中调用以提高下载效率。

代码实现

    public class ImageDownloader
    {
        private int minImageSize = 1024 * 10;
        private int limitImageSize = 1024 * 1024;

        public Image SaveWebImage(string url, string savePath)
        {
            try
            {
                if (url.EndsWith("gif"))
                    return null;

                using (var c = new WebClient())
                {
                    string imgUrl = url;
                    if (imgUrl.StartsWith("//"))
                    {
                        imgUrl = "http:" + imgUrl;
                    }
                    var img = Image.FromStream(new MemoryStream(c.DownloadData(imgUrl)));
                    // 小图直接略过
                    if (img.Width < 200 || img.Height < 200)
                        return null;
                    var r = Resize(img, 640, 640, true);
                    r.Save(savePath);

                    var fileInfo = new FileInfo(savePath);
                    if (fileInfo.Length < minImageSize) // 如果小于10kb那就是无效图片
                        return r;
                    if (fileInfo.Length > limitImageSize) // 品质可以通过参数来控制
                    {
                        EncoderParameters encoderParams = new EncoderParameters();
                        long[] quality = new long[1];
                        quality[0] = 85; // 品质参数,最大为100
                        EncoderParameter encoderParam = new EncoderParameter(Encoder.Quality, quality);
                        encoderParams.Param[0] = encoderParam;
                        ImageCodecInfo codecInfo = GetEncoder(ImageFormat.Jpeg);
                        r.Save(savePath, codecInfo, encoderParams);
                        encoderParam.Dispose();
                        encoderParams.Dispose();
                    }
                    img.Dispose();
                    return r;
                }
            }
            catch (Exception ex)
            {
                LogHelper.Error(ex);
                LogHelper.Error("error url:" + url);
                return null;
            }
        }

        public Image Resize(Image image, int newWidth, int maxHeight, bool onlyResizeIfWider)
        {
            if (onlyResizeIfWider && image.Width <= newWidth) newWidth = image.Width;

            var newHeight = image.Height * newWidth / image.Width;
            var res = new Bitmap(newWidth, newHeight);

            using (var graphic = Graphics.FromImage(res))
            {
                graphic.InterpolationMode = InterpolationMode.HighQualityBicubic;
                graphic.SmoothingMode = SmoothingMode.HighQuality;
                graphic.PixelOffsetMode = PixelOffsetMode.HighQuality;
                graphic.CompositingQuality = CompositingQuality.HighQuality;
                graphic.DrawImage(image, 0, 0, newWidth, newHeight);
            }

            return res;
        }

        #region Private Methods

        private ImageCodecInfo GetEncoder(ImageFormat format)
        {

            ImageCodecInfo[] codecs = ImageCodecInfo.GetImageDecoders();

            foreach (ImageCodecInfo codec in codecs)
            {
                if (codec.FormatID == format.Guid)
                {
                    return codec;
                }
            }
            return null;
        }

        #endregion
    }


http://www.kler.cn/a/159832.html

相关文章:

  • 准确率调整研究中心
  • C# 模拟浏览器自操作(自动化办公)
  • 某app最新版 vmp算法分析一
  • 移动端【01】面试系统的MVVM重构实践
  • 【juc】AbstractQueuedSynchronized为什么采用双向链表
  • EasyExcel 使用多线程按顺序导出数据
  • 查收查引(通过文献检索开具论文收录或引用的检索证明)
  • pycharm上传代码至gitLab
  • 逻辑漏洞之越权漏洞
  • 每天一点python——day88
  • Ubuntu 环境安装 Kafka、配置运行测试 Kafka 流程笔记
  • 案例052:用于日语词汇学习的微信小程序
  • 【laBVIEW学习】4.声音播放,自定义图标,滚动条设置,保存参数以及恢复参数
  • 前端模拟新闻列表ajax请求 mocky
  • TortoiseGit 小乌龟svn客户端软件查看仓库地址
  • 分布式锁常见实现方案
  • Android自动化测试中使用ADB进行网络状态管理!
  • CMake编译C++项目并链接动态库
  • 【Linux】信号的保存和捕捉
  • 在eclipse中安装python插件:PyDev
  • Python环境管理利器-Anaconda介绍与安装
  • 三相电表可以当作高压电表使用吗?
  • blade 项目
  • Vue学习笔记-activated和deactivated生命周期
  • 七、VMware虚拟机安装和docker容器部署项目
  • 二叉树OJ题之三