`

给上传的文件生成缩略图(图片和视频)

    博客分类:
  • C#
 
阅读更多
备注:里面用到的ffmpeg可在https://ffmpeg.zeranoe.com/builds/ 下载


1、根据视频,生成截图
#region 从视频画面中截取一帧画面为图片
        /// <summary>
        /// 从视频画面中截取一帧画面为图片
        /// </summary>
        /// <param name="VideoName">视频文件,绝对路径</param>
        /// <param name="WidthAndHeight">图片的尺寸如:240*180</param>
        /// <param name="CutTimeFrame">开始截取的时间如:"1"</param>
        /// <returns></returns>
        public static string GetPicFromVideo(string VideoName, string WidthAndHeight, string CutTimeFrame)
        {
            //ffmpeg执行文件的路径
            string ffmpeg = System.AppDomain.CurrentDomain.BaseDirectory + "ffmpeg\\ffmpeg.exe";
            string PicName = VideoName + ".jpg";//视频图片的名字,绝对路径
            System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(ffmpeg);
            startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
            startInfo.Arguments = " -i " + VideoName
                                + " -y -f image2 -ss " + CutTimeFrame
                                + " -t 0.001 -s " + WidthAndHeight
                                + " " + PicName;  //設定程式執行參數
            try
            {
                System.Diagnostics.Process.Start(startInfo);
                Thread.Sleep(5000);//线程挂起,等待ffmpeg截图完毕
            }
            catch (Exception e)
            {
                return e.Message;
            }

            //返回视频图片完整路径
            if (System.IO.File.Exists(PicName))
                return PicName;
            return "";
        }
        #endregion


2、图片压缩并保存GetPicThumbnail
#region 图片压缩并保存GetPicThumbnail
        /// <summary>
        /// 无损压缩图片
        /// </summary>
        /// <param name="sFile">原文件位置</param>
        /// <param name="dFile">压缩后保存位置</param>
        /// <param name="flag">压缩比例,eg:按照百分比算如80,就是原图的高度乘以80%</param>
        /// <returns></returns>
        public static bool GetPicThumbnail(string sFile, string dFile, int flag)
        {
            System.Drawing.Image iSource = System.Drawing.Image.FromFile(sFile);
            ImageFormat tFormat = iSource.RawFormat;
            int sW = 0, sH = 0;
            //按比例缩放
            Size tem_size = new Size(iSource.Width, iSource.Height);
            int dHeight = iSource.Height * flag / 100; //高度压缩百分不
            int dWidth = iSource.Width * flag / 100;//宽度压缩百分比
            if (tem_size.Width > dHeight || tem_size.Width > dWidth) //将**改成c#中的或者操作符号
            {
                if ((tem_size.Width * dHeight) > (tem_size.Height * dWidth))
                {
                    sW = dWidth;
                    sH = (dWidth * tem_size.Height) / tem_size.Width;
                }
                else
                {
                    sH = dHeight;
                    sW = (tem_size.Width * dHeight) / tem_size.Height;
                }
            }
            else
            {
                sW = tem_size.Width;
                sH = tem_size.Height;
            }

            Bitmap ob = new Bitmap(dWidth, dHeight);
            Graphics g = Graphics.FromImage(ob);
            g.Clear(Color.WhiteSmoke);
            g.CompositingQuality = CompositingQuality.HighQuality;
            g.SmoothingMode = SmoothingMode.HighQuality;
            g.InterpolationMode = InterpolationMode.HighQualityBicubic;
            g.DrawImage(iSource, new Rectangle((dWidth - sW) / 2, (dHeight - sH) / 2, sW, sH), 0, 0, iSource.Width, iSource.Height, GraphicsUnit.Pixel);
            g.Dispose();
            //以下代码为保存图片时,设置压缩质量
            EncoderParameters ep = new EncoderParameters();
            long[] qy = new long[1];
            qy[0] = flag;//设置压缩的比例1-100
            EncoderParameter eParam = new EncoderParameter(System.Drawing.Imaging.Encoder.Quality, qy);
            ep.Param[0] = eParam;
            try
            {
                ImageCodecInfo[] arrayICI = ImageCodecInfo.GetImageEncoders();

                ImageCodecInfo jpegICIinfo = null;

                for (int x = 0; x < arrayICI.Length; x++)
                {
                    if (arrayICI[x].FormatDescription.Equals("JPEG"))
                    {
                        jpegICIinfo = arrayICI[x];
                        break;
                    }
                }
                if (jpegICIinfo != null)
                {
                    ob.Save(dFile, jpegICIinfo, ep);//dFile是压缩后的新路径
                }
                else
                {
                    ob.Save(dFile, tFormat);
                }
                return true;
            }
            catch
            {
                return false;
            }
            finally
            {
                iSource.Dispose();
                ob.Dispose();

            }
        }
        #endregion



3、循环文件夹中的所有文件,生成对应的压缩图片   需要用到循环调用
先调用获取目录下所有文件夹的方法,此方法中调用了getFileName方法,也调用了自己,可实现循环遍历直到把所有文件都执行一边

#region 获取指定路径下所有文件名
        /// <summary>
        /// 获得指定路径下所有文件名
        /// </summary>
        /// <param name="path">文件写入流</param>
        public static void getFileName(string path)
        {
            string filePath = string.Empty;
            string newFilePath = string.Empty;
            DirectoryInfo root = new DirectoryInfo(path);
            FileInfo[] files = root.GetFiles();
            foreach (FileInfo f in files)
            {
                filePath = f.FullName;  //完整的目录名 
                newFilePath = filePath.Replace("D:\\DataImgs", "D:\\DataImgs\\thumbnail");
                if (f.Name.ToLower().Contains("mp4") || f.Name.ToLower().Contains("avi") || f.Name.ToLower().Contains("rmvb"))
                {
                    //针对MP4,把第一帧存为图片
                    GetPicFromVideo(filePath, "100*160", "1", ffmpeg);
                }
                else
                {
                    //如果是图片都放到thumbnail文件夹下
                    GetPicThumbnail(filePath, newFilePath, 40);
                }
            }
        }
        #endregion

        #region 获取指定路径下所有子目录名
        /// <summary>
        /// 获得指定路径下所有子目录名
        /// </summary>
        /// <param name="path">文件夹路径</param>
        /// <param name="indent">输出时的缩进量</param>
        public static void getDirectory(string path)
        {
            getFileName(path);
            string dirPath = string.Empty;
            string newDirPath = string.Empty;
            DirectoryInfo root = new DirectoryInfo(path);
            DirectoryInfo[] dirs = root.GetDirectories();
            foreach (DirectoryInfo d in dirs)
            {
                dirPath = d.FullName;
                if (dirPath == "D:\\DataImgs\\thumbnail")
                {
                    MessageBox.Show("操作完成!");
                }
                else
                {
                    newDirPath = dirPath.Replace("D:\\DataImgs", "D:\\DataImgs\\thumbnail");  //更换文件夹创建路径
                    if (!Directory.Exists(newDirPath))   //如果不存在,则创建此文件夹
                    {
                        Directory.CreateDirectory(newDirPath);
                    }
                    getDirectory(dirPath);
                }
            }
        }
        #endregion



有了这几个文件,批量压缩或者单独在上传时压缩又能游刃有余了
分享到:
评论

相关推荐

    java 上传图片生成缩略图

    本文介绍了使用Java实现上传图片并生成缩略图的方法,包括获取文件路径、读取图像、创建缩略图及保存缩略图等步骤。通过这种方式,可以在不损失原图质量的前提下,有效地减少加载时间,提升用户体验。此外,本文还...

    基于Springmvc的上传图片并生成缩略图

    总结来说,基于Springmvc的图片上传和生成缩略图功能涉及以下几个关键步骤:配置Springmvc支持文件上传,编写Controller处理上传请求,生成并保存缩略图,以及与前端交互提供反馈。这些步骤都需要对Springmvc、文件I...

    html5图片上传本地生成缩略图预览

    在图片预览和缩略图生成中,我们可以利用Canvas的drawImage方法将图片加载到Canvas上,然后通过调整Canvas的宽度和高度来生成缩略图。 3. **Data URL**:Data URL是一种内联资源表示方式,可以直接在页面中嵌入图像...

    jsp上传图片并生成缩略图

    综上所述,实现"jsp上传图片并生成缩略图"的过程涉及到文件上传处理、图片的读取与缩放、文件存储以及错误处理等多方面技术。通过合理的设计和选用合适的工具库,可以在JSP中有效地实现这一功能。在实际开发中,还...

    java视频生成图片(缩略图)-实例-(指定时间)

    在生成缩略图后,你可能需要使用JAI来调整图片的大小和格式。 4. **JavaFX:** 虽然JavaFX主要是用于构建桌面和网页应用的图形用户界面,但它也包含了一些处理媒体的类,可以用于视频播放和截图。通过`Media`和`...

    上传图片并生成高清晰缩略图

    return "上传及生成缩略图成功"; } catch (Exception ex) { return "处理过程中发生错误:" + ex.Message; } } return "未上传文件"; } ``` ### 总结 通过以上方法,可以在ASP.NET项目中轻松实现上传图片...

    jSP上传图片生成缩略图

    在这个特定的场景中,"jSP上传图片生成缩略图"是一个常见的需求,尤其在网站开发中,如论坛、博客或电商网站等,用户可能需要上传图片,而为了提高页面加载速度和优化用户体验,通常会生成缩略图作为预览。...

    struts2图片上传并生成缩略图,展示缩略图点击显示大图

    在这个场景中,我们将关注如何使用Struts2框架结合FileUpload库来实现图片上传,并通过生成缩略图来优化用户体验。Struts2是一个流行的Java Web框架,它提供了一种结构化的方式来处理用户请求,而FileUpload则是处理...

    asp无组件上传图片,aspjpeg生成缩略图和添加水印.zip

    在这个"asp无组件上传图片,aspjpeg生成缩略图和添加水印.zip"压缩包中,包含了解决这一问题的代码示例。主要涉及到以下几个核心知识点: 1. **图片上传**: ASP可以通过表单提交实现图片文件的上传。用户选择本地...

    JSP上传图片并生成缩略图

    在这个特定的场景中,"JSP上传图片并生成缩略图"是一个常见的功能需求,尤其是在开发包含用户交互和多媒体内容的Web应用时。下面我们将详细探讨这一技术实现的关键知识点。 首先,**上传组件**是Web应用中用于接收...

    asp.net 多文件上传并对图片文件生成缩略图

    接下来,我们处理图片文件生成缩略图。可以使用Image类和Graphics类提供的方法来完成。首先,读取原图,然后根据需要的尺寸创建一个新的Bitmap对象,再使用Graphics.DrawImage方法将原图绘制到新Bitmap上,最后保存...

    Asp.net上传图片同时生成缩略图和水印图

    在ASP.NET中,上传图片并生成缩略图和水印图...总的来说,ASP.NET中上传图片并生成缩略图和水印图的过程涉及文件上传、文件操作、图像处理等多个方面,通过熟练掌握这些技术,可以构建出高效且功能丰富的图片管理系统。

    liunx 上传word文件生成缩略图

    在PHP中,使用Imagick扩展可以轻松地从Word文件生成缩略图。以下是一个示例代码片段: ```php $im = new Imagick(); $im-&gt;setCompressionQuality(100); // 假设你有一个名为'example.docx'的Word文件 $docFile = ...

    多图片上传-判断图片像素-生成缩略图

    在IT领域,多图片上传、判断图片像素以及生成缩略图是常见的图像处理技术,尤其在网站开发和移动应用设计中极为重要。这些功能能够优化用户体验,减少服务器存储空间,并加速网页加载速度。下面我们将详细探讨这三个...

    pdf生成缩略图

    PDF生成缩略图是将PDF文档中的页面转换成小尺寸的图像表示,通常用于预览、索引或在文件管理器中快速查看PDF内容。在IT领域,这涉及到PDF处理和图像处理技术。以下是一些关于如何在C#中生成PDF缩略图的关键知识点: ...

    struts2上传文件、生成缩略图、添加文字和图片水印

    生成缩略图和添加水印时,也需防止内存溢出或资源泄露,确保图片处理过程的安全性。 以上就是关于"Struts2上传文件、生成缩略图、添加文字和图片水印"的主要知识点,理解并掌握这些技术可以帮助开发者实现高效、...

    java批量上传图片并生成缩略图

    总之,实现"java批量上传图片并生成缩略图"的功能,需要结合Java的Servlet技术处理文件上传,使用图像处理库生成缩略图,并且在前后端之间进行有效的通信。这不仅是技术上的挑战,也是对系统设计和优化能力的考验。

    html5移动端图片上传本地生成缩略图预览(单图上传)

    预览图片后,我们可能还需要生成缩略图,以减小数据传输量或适应不同的展示尺寸。这里我们可以利用HTML5的Canvas元素。 1. 创建一个canvas元素,并获取其2D渲染上下文。 ```javascript var canvas = document....

    无刷新上传--可生成缩略图--demo.zip

    最后,生成缩略图是图像处理的一部分,常用于节省服务器空间和提高页面加载速度。在PHP中,可以使用GD库或Imagick扩展来创建缩略图。在这个DEMO中,可能包含一段代码,根据上传的图片生成预览尺寸的缩略图,用于展示...

    php 上传图片生成缩略图

    php 上传图片生成缩略图 在PHP中获取EXIF信息应用EXIF函数库中的函数。首先,应该确定EXIF函数是否已经加载,在php.ini文件中查看“extension=php_exif.dll”前是否有分号“;”,如果有则说明未加载,那么就要去掉...

Global site tag (gtag.js) - Google Analytics