欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

用C#缩小照片上传到各种空间的具体方法

程序员文章站 2024-02-19 11:31:34
本人一般也很少上传照片之类的女生喜欢玩的东西,但是偶尔还是要传一传的,为什么?因为现在与各种以前的朋友同学都很少联系,但是只要一发有个人照片的微博或日志便引来各种鲜花鸡蛋。...

本人一般也很少上传照片之类的女生喜欢玩的东西,但是偶尔还是要传一传的,为什么?因为现在与各种以前的朋友同学都很少联系,但是只要一发有个人照片的微博或日志便引来各种鲜花鸡蛋。

周末和几个同学去了西涌露营,这么美丽的海滩不上传照片分享着实可惜,可是现在的相机拍出来的照片很大,特别是单反,而咱们的网络带宽又何其可怜,所以先压缩再上传会是非常好的选择,可是呢这么多张照片一张张压缩太麻烦了(鄙人对作图是小白,不懂得使用做图工具),而咱是码农,码农就要用码农的方式,于是乎就想做个程序了。

好了废话了那么多开工了。

第一次迭代开始,先完成单张相片压缩的demo。我始终坚信好的代码是重构出来的,因而在这里我将使用迭代开发的思想逐步完成这个程序。先看下第一次迭代的代码

复制代码 代码如下:

static void main(string[] args)
        {
            string savepath = @"e:\2013相片\上传前\";
            string sourcepath = @"e:\2013相片\qq空间使用\";
            string sourcename = "dsc_0216.jpg";
            int scale = 5;

            image img = image.fromfile(sourcepath + sourcename);
            int width = img.width / scale;
            int height = img.height / scale;

            image imgnew = new bitmap(width, height);
            graphics g = graphics.fromimage(imgnew);
            g.drawimage(img, new system.drawing.rectangle(0, 0, width, height),
            new system.drawing.rectangle(0, 0, img.width, img.height),
            system.drawing.graphicsunit.pixel);

            imgnew.save(savepath + "a.jpg", imageformat.jpeg);
        }


  这样就保证了这个代码已经能处理单张照片了。

  第二次迭代,对其进行重构。

经过分析,该功能的实现需要两步,第一获取要缩小的图片集合,第二就是缩小图片的逻辑,故而就有了以下重构后的代码

复制代码 代码如下:

class program
    {
        static readonly string[] image_extname = new string[] { "jpg"};
        static void main(string[] args)
        {
            string savepath = @"e:\2013相片\上传前\";
            string sourcepath = @"e:\2013相片\qq空间使用\";
            int scale = 5;

            list<string> imagenames = getimagenames(sourcepath);
            if (imagenames != null && imagenames.count > 0)
            {
                foreach (var item in imagenames)
                {
                    savesmallphoto(sourcepath + item, scale, savepath + item);
                }
            }
        }

        /// <summary>
        /// 获取路径下所有符合指定图片后缀文件名
        /// </summary>
        /// <param name="path">路径</param>
        /// <returns></returns>
        static list<string> getimagenames(string path)
        {
            string[] filenames = directory.getfiles(path);
            if (filenames == null || filenames.length == 0)
            {
                return null;
            }

            list<string> imagenames = new list<string>();
            foreach (var item in filenames)
            {
                if (existsinextname(item, image_extname))
                {
                    imagenames.add(item.substring(item.lastindexof('\\') + 1));
                }
            }

            return imagenames;
        }

        /// <summary>
        /// 判断文件名是否符合指定后缀名
        /// </summary>
        /// <param name="name">文件名</param>
        /// <param name="extnames">符合要求的后缀名</param>
        /// <returns></returns>
        static bool existsinextname(string name, string[] extnames)
        {
            if (string.isnullorempty(name) || extnames == null || extnames.length == 0)
            {
                return false;
            }

            foreach (var item in extnames)
            {
                if (name.tolower().endswith(item))
                {
                    return true;
                }
            }

            return false;
        }

        /// <summary>
        /// 将图片按比例缩小保存
        /// </summary>
        /// <param name="frompath">原图片路径名</param>
        /// <param name="scale">缩小比例</param>
        /// <param name="topath">缩小后保存的路径名</param>
        static void savesmallphoto(string frompath, int scale, string topath)
        {
            int width, height;
            using (image img = image.fromfile(frompath))
            {
                width = img.width / scale;
                height = img.height / scale;

                using (image imgnew = new bitmap(width, height))
                {
                    using (graphics g = graphics.fromimage(imgnew))
                    {
                        g.drawimage(img, new rectangle(0, 0, width, height),
                            new rectangle(0, 0, img.width, img.height), system.drawing.graphicsunit.pixel);
                    }

                    imgnew.save(topath, imageformat.jpeg);
                }
            }
        }
    }


是不是很简单啊?在这里使用的一些路径比例的变量,可将其写在配置文件,后续再压缩照片,只要修改相应配置即可轻松实现。

完了之后,大家有更好的关于压缩照片的办法不妨拿出来分享下!