/// <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