zoukankan      html  css  js  c++  java
  • 生成image类,video,pdf提取图像

    /// <summary>
    		/// 取得缩略图
    		/// </summary>
    		/// <param name="sourceImg"></param>
    		/// <param name="width"></param>
    		/// <param name="height"></param>
    		/// <returns></returns>
    		public static System.Drawing.Image GetThumb(System.Drawing.Image sourceImg, int width, int height)
    		{
    			System.Drawing.Image targetImg = new Bitmap(width, height);
    			using (System.Drawing.Graphics g = System.Drawing.Graphics.FromImage(targetImg))
    			{
    				g.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.High;
    				g.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality;
    				g.Clear(Color.White);
    				g.DrawImage(sourceImg, new Rectangle(0, 0, width, height), new Rectangle(0, 0, sourceImg.Width, sourceImg.Height), GraphicsUnit.Pixel);
    				g.Dispose();
    			}
    
    			return targetImg;
    		}
    		//#region pdf截图
    
    		///// <summary>
    		///// 
    		///// </summary>
    		///// <param name="pdfFilePath"></param>
    		///// <param name="imgOutPath"></param>
    		///// <returns></returns>//这个在xp,win7可以用,但是在win2003下报访问剪切板失败的异常,求解
    		//public static string ConvertPdf2Image(string pdfFilePath, string imgOutPath)
    		//{
    		//    if (!System.IO.File.Exists(pdfFilePath))
    		//    {
    		//        return string.Empty;
    		//    }
    		//    string msg = string.Empty;
    		//    try
    		//    {
    		//        ConvertPdf2Image(pdfFilePath, imgOutPath, 0, 1, null, 1);
    		//        if (System.IO.File.Exists(imgOutPath))
    		//        {
    		//            return imgOutPath;
    		//        }
    		//        else
    		//            return string.Empty;
    		//    }
    		//    catch (System.Exception ex)
    		//    {
    		//        
    		//        return string.Empty;
    		//    }
    
    		//}
    		/////// <summary>
    		/////// pdf转image缩略图
    		/////// </summary>
    		/////// <param name="pdfFilePath"></param>
    		/////// <param name="imageDirectoryPath"></param>
    		/////// <param name="beginPageNum"></param>
    		/////// <param name="endPageNum"></param>
    		/////// <param name="format"></param>
    		/////// <param name="zoom"></param>//安装Acrobat软件100多M大小
    		////public static void ConvertPdf2Image(string pdfFilePath, string imageDirectoryPath, int beginPageNum, int endPageNum, ImageFormat format, double zoom)
    		////{
    		////    if (!System.IO.File.Exists(pdfFilePath))
    		////    {
    		////        return;
    		////    }
    		////    zoom = 1;
    		////    Acrobat.CAcroPDDoc pdfDoc = null;
    		////    Acrobat.CAcroPDPage pdfPage = null;
    		////    Acrobat.CAcroRect pdfRect = null;
    		////    Acrobat.CAcroPoint pdfPoint = null;
    
    		////    //生成操作Pdf文件的Com对象
    		////    //            pdfDoc = (Acrobat.CAcroPDDoc)Microsoft.VisualBasic.Interaction.CreateObject("AcroExch.PDDoc", "");
    		////    var CreatePdf = Microsoft.VisualBasic.Interaction.CreateObject("AcroExch.PDDoc", "");
    		////    pdfDoc = (Acrobat.CAcroPDDoc)CreatePdf;
    
    		////    //检查输入参数
    		////    if (!pdfDoc.Open(pdfFilePath))
    		////    {
    		////        throw new FileNotFoundException(string.Format("源文件{0}不存在!", pdfFilePath));
    		////    }
    		////    string dir = System.IO.Path.GetDirectoryName(imageDirectoryPath);
    		////    if (!Directory.Exists(dir))
    		////    {
    		////        Directory.CreateDirectory(dir);
    		////    }
    
    		////    if (beginPageNum <= 0)
    		////    {
    		////        beginPageNum = 1;
    		////    }
    
    		////    if (endPageNum > pdfDoc.GetNumPages() || endPageNum <= 0)
    		////    {
    		////        endPageNum = pdfDoc.GetNumPages();
    		////    }
    
    		////    if (beginPageNum > endPageNum)
    		////    {
    		////        throw new ArgumentException("参数\"beginPageNum\"必须小于\"endPageNum\"!");
    		////    }
    
    		////    if (format == null)
    		////    {
    		////        format = ImageFormat.Jpeg;
    		////    }
    
    		////    if (zoom <= 0)
    		////    {
    		////        zoom = 1;
    		////    }
    
    		////    //转换
    		////    for (int i = beginPageNum; i <= endPageNum; i++)
    		////    {
    		////        //取出当前页
    		////        pdfPage = (Acrobat.CAcroPDPage)pdfDoc.AcquirePage(i - 1);
    		////        //得到当前页的大小
    		////        pdfPoint = (Acrobat.CAcroPoint)pdfPage.GetSize();
    		////        //生成一个页的裁剪区矩形对象
    		////        pdfRect = (Acrobat.CAcroRect)Microsoft.VisualBasic.Interaction.CreateObject("AcroExch.Rect", "");
    
    		////        //计算当前页经缩放后的实际宽度和高度,zoom==1时,保持原比例大小
    		////        int imgWidth = (int)((double)pdfPoint.x * zoom);
    		////        int imgHeight = (int)((double)pdfPoint.y * zoom);
    
    		////        //设置裁剪矩形的大小为当前页的大小
    		////        pdfRect.Left = 0;
    		////        pdfRect.right = (short)imgWidth;
    		////        pdfRect.Top = 0;
    		////        pdfRect.bottom = (short)imgHeight;
    				
    		////        //将当前页的裁剪区的内容编成图片后复制到剪贴板中
    		////        Thread cbThread = new Thread(new ThreadStart(delegate
    		////        {
    		////            try
    		////            {
    		////                Clipboard.Clear();
    		////                pdfPage.CopyToClipboard(pdfRect, 0, 0, (short)(100 * zoom));
    		////                IDataObject clipboardData = Clipboard.GetDataObject();
    		////                //检查剪贴板中的对象是否是图片,如果是图片则将其保存为指定格式的图片文件
    		////                if (clipboardData.GetDataPresent(DataFormats.Bitmap))
    		////                {
    
    		////                    Bitmap pdfBitmap = (Bitmap)clipboardData.GetData(DataFormats.Bitmap);
    		////                    pdfBitmap.Save(imageDirectoryPath,ImageFormat.Jpeg);
    		////                    pdfBitmap.Dispose();
    		////                }
    		////                //System.Drawing.Image img = GetThumb(Clipboard.GetImage(), 200, 150);
    		////                //if (img != null)
    		////                //{
    		////                //    img.Save(imageDirectoryPath);
    		////                //}
    		////            }
    		////            catch (System.Exception ex)
    		////            {
    		////                
    		////            }
    					
    		////        }));
    		////        cbThread.ApartmentState = ApartmentState.STA;//在老外那里看到asp.net不正常,用这个方法解决这个问题
    		////        cbThread.Start();
    		////        cbThread.Join();
    		////    }
    
    		////    //关闭和释放相关COM对象
    		////    pdfDoc.Close();
    		////    Marshal.ReleaseComObject(pdfRect);
    		////    Marshal.ReleaseComObject(pdfPoint);
    		////    Marshal.ReleaseComObject(pdfPage);
    		////    Marshal.ReleaseComObject(pdfDoc);
    
    		////}
    		//#endregion
    
    		#region 视频格式mp4,3gp,flv截图。注意swf除外
    		/// <summary>
    		/// 视频格式mp4,3gp,flv截图。注意swf除外
    		/// </summary>
    		/// <param name="vFileName"></param>
    		/// <param name="outImgPath"></param>
    		/// <returns></returns>
    		public static string ConvertVideo2Image(string vFileName, string outImgPath)
    		{
    			int[] size = WebConfiguration.ConverterSetting.GetThumbSize();
    		   return ConvertVideo2Image( vFileName, outImgPath,size[0],size[1]);
    		}
    		/// <summary>
    		/// 视频格式mp4,3gp,flv截图。注意swf除外
    		/// </summary>
    		/// <param name="vFileName"></param>
    		/// <param name="outImgPath"></param>
    		/// <param name="width"></param>
    		/// <param name="height"></param>
    		/// <returns></returns>
    		public  static string ConvertVideo2Image(string vFileName,string outImgPath,int width,int height)
    		{
    			//取得ffmpeg.exe的路径,路径配置在Web.Config中,如:<add key="ffmpeg" value="E:\ffmpeg\ffmpeg.exe" />
    			string ffmpeg = WebConfiguration.ConverterSetting.GetFfmpegExePath();// System.Configuration.ConfigurationSettings.AppSettings["ffmpeg"];
    			if ((!System.IO.File.Exists(ffmpeg)) || (!System.IO.File.Exists(vFileName)))
    			{
    				return "error:not find the ffmpeg exe";
    			}
    			
    			string flv_img = outImgPath;
    			//截图的尺寸大小,配置在Web.Config中,如:<add key="CatchFlvImgSize" value="240x180" />
    			string FlvImgSize = width+"x"+height;
    			System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(ffmpeg);
    			startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
    			//此处组合成ffmpeg.exe文件需要的参数即可,此处命令在ffmpeg 0.4.9调试通过
    			startInfo.Arguments = " -i " + vFileName + " -y -f image2 -t 0.001 -ss 4 -s " + FlvImgSize + " " + outImgPath;
    			try
    			{
    				System.Diagnostics.Process.Start(startInfo);
    			}
    			catch
    			{
    				return "error:catch";
    			}
    			///注意:图片截取成功后,数据由内存缓存写到磁盘需要时间较长,大概在3,4秒甚至更长;
    			///这儿需要延时后再检测,我服务器延时8秒,即如果超过8秒图片仍不存在,认为截图失败;
    			///此处略去延时代码.如有那位知道如何捕捉ffmpeg.exe截图失败消息,请告知,先谢过!
    			Thread.Sleep(500);
    			if (System.IO.File.Exists(flv_img))
    			{
    				return flv_img;
    			}
    			return "error:not create cath img";
    		}
    		#endregion
    
    
    		#region pdf提取图像
    		/// <summary>
    		/// 从pdf中提取第一页,转为图像 
    		/// </summary>
    		/// <param name="InputFile"></param>
    		/// <param name="filename"></param>
    		/// <returns></returns>
    		public static string ConvertPdf2Image(string InputPdfFilePath , string OutImgFilePath)
    		{
    			string tempImg = System.IO.Path.GetDirectoryName(OutImgFilePath)+"\\" + System.IO.Path.GetFileNameWithoutExtension(OutImgFilePath) + "#temp.jpg";
    			string msg = ConvertPdf2Image(InputPdfFilePath, false, tempImg, "-dSAFER -dBATCH -dNOPAUSE -r150 -sDEVICE=jpeg -dGraphicsAlphaBits=4 -dFirstPage=1 -dLastPage=1 ");
    			if (System.IO.File.Exists(tempImg))
    			{
    				try
    				{
    					int[] size = WebConfiguration.ConverterSetting.GetThumbSize();
    					BLL.Common.Image.GetThumb(System.Drawing.Image.FromFile(tempImg), size[0], size[1]).Save(OutImgFilePath);
    					if (System.IO.File.Exists(tempImg))//删除临时文件
    					{
    						System.IO.File.Delete(tempImg);
    					}
    				}
    				catch (System.Exception ex)
    				{
    					return "error:" + ex.Message;
    				}
    				
    			}
    			if (msg.StartsWith("error"))
    			{
    				return msg;
    			}
    			else
    				return OutImgFilePath;
    		}
    
    		private static string ConvertPdf2Image(string InputFile, bool deletePDF, string filename, string Arguments)
    		{
    			string msg = string.Empty;
    			string OutputFile = filename;
    			string ExtOut = Path.GetExtension(OutputFile);
    			string partOut = OutputFile.Remove(OutputFile.Length - ExtOut.Length, ExtOut.Length);
    			ProcessStartInfo info = new ProcessStartInfo();
    			info.CreateNoWindow = true;
    			info.WindowStyle = ProcessWindowStyle.Hidden;
    			info.WorkingDirectory = WebConfiguration.ConverterSetting.GetPdf2ImageConverterPath();//System.Configuration.ConfigurationSettings.AppSettings["GhostScriptView"];
    			info.Arguments = Arguments + @" -sOutputFile=" + OutputFile + "  " + InputFile;
    			info.FileName = @"gswin32c.exe";//下载gs
    			Process subProcess = new Process();
    			subProcess.StartInfo = info;
    			subProcess.Start();
    			subProcess.WaitForExit(int.MaxValue);
    			if (System.IO.File.Exists(filename))
    			{
    				return filename;
    			}
    
    			return "error:not create cath img";
    		}
    
    		private int ReadPDFCount(string InputFile)
    		{
    			FileStream fs = new FileStream(InputFile, FileMode.Open, FileAccess.Read);
    			StreamReader r = new StreamReader(fs);
    			string pdfText = r.ReadToEnd();
    			// 一旦获取了pdf文本,我们需要做的就是使用正则表达式计算:"/Type /Page" 标记出现的次数。
    			Regex rx1 = new Regex(@"/Type\s*/Page[^s]");
    			MatchCollection matches = rx1.Matches(pdfText);
    
    			return Convert.ToInt32(matches.Count);
    		}
    		#endregion
    

      

  • 相关阅读:
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第50章 读书笔记(待更新)
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第49章 读书笔记(待更新)
    Algebra, Topology, Differential Calculus, and Optimization Theory For Computer Science and Machine Learning 第48章 读书笔记(待更新)
    Spring Boot 中使用 Quartz 实现任务调度
    实战 FastDFS Java 客户端上传文件
    分布式文件系统之 FastDFS
    Java 持久层框架之 MyBatis
    C语言实现贪吃蛇
    [转载]分享三篇非常好的学习心得
    selenium加载cookie报错问题:selenium.common.exceptions.InvalidCookieDomainException: Message: invalid cookie domain
  • 原文地址:https://www.cnblogs.com/jtans/p/2758753.html
Copyright © 2011-2022 走看看