最近公司有個項目,要抓取客戶微信公衆號的文章,以及文章內容中的圖片,而且在圖片加上客戶本身的水印。咱們使用阿里雲OSS存儲圖片和加水印,發現真心好用,提高了咱們的開發效率,阿里雲如今是愈來愈強大了...... 不廢話,繼續正題......html
本來想得很簡單,gif圖片不打水印,其它圖片格式都加。判斷文件類型的方法,參考了園子裏的作法:sql
http://www.cnblogs.com/babycool/p/3531696.html瀏覽器
/// <summary> /// 判斷文件格式 /// http://www.cnblogs.com/babycool /// </summary> /// <param name="filePath"></param> /// <returns></returns> public static bool IsAllowedExtension(string filePath) { FileStream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read); BinaryReader reader = new BinaryReader(stream); string fileclass = ""; // byte buffer; try { //buffer = reader.ReadByte(); //fileclass = buffer.ToString(); //buffer = reader.ReadByte(); //fileclass += buffer.ToString(); for (int i = 0; i < 2; i++) { fileclass += reader.ReadByte().ToString(); } } catch (Exception) { throw; } if (fileclass == "255216") { return true; } else { return false; } /*文件擴展名說明 * 255216 jpg * 208207 doc xls ppt wps * 8075 docx pptx xlsx zip * 5150 txt * 8297 rar * 7790 exe * 3780 pdf * * 4946/104116 txt * 7173 gif * 255216 jpg * 13780 png * 6677 bmp * 239187 txt,aspx,asp,sql * 208207 xls.doc.ppt * 6063 xml * 6033 htm,html * 4742 js * 8075 xlsx,zip,pptx,mmap,zip * 8297 rar * 01 accdb,mdb * 7790 exe,dll * 5666 psd * 255254 rdp * 10056 bt種子 * 64101 bat * 4059 sgf */ }
但程序運行期間,發現有一種png圖片是動圖,被加上水印後,圖片就不動了(文章效果差)。微信
網上一查原來是一種叫apng格式的圖片,彌補了gif圖片在顯示效果上的不足,但只支持現代瀏覽器(手機基本都支持)。阿里雲
仔細想一想,既然判斷前2個字符能夠肯定文件類型,那麼是否是png格式和apng格式,在文件結構上是有區別的。網上查了下,也驗證了個人想法是對的。spa
首先:維基百科上的描述夠專業 https://en.wikipedia.org/wiki/APNG (E文很差,軟件翻譯下).net
其次,CSDN上郭曉東專欄,對PNG格式解釋得夠清楚了(雖然有些沒看懂)翻譯
http://blog.csdn.net/hherima/article/details/458470433d
http://blog.csdn.net/hherima/article/details/45848171code
因而照貓畫虎找了2個png動圖(apng格式),用UltraEdit打開看看
acTL這小樣兒躲在這啊,管他什麼鬼,第37-40之間的值 ,這應該就是區分png格式和apng格式的關鍵所在。
修改了一下上面仁兄的代碼:
private static string IsAllowedExtension(string filePath) { FileStream stream = new FileStream(filePath, FileMode.Open, FileAccess.Read); BinaryReader reader = new BinaryReader(stream); string fileclass = ""; // byte buffer; try { byte[] head = reader.ReadBytes(41); for (int i = 0; i < 2; i++) { fileclass += head[i].ToString(); } if (fileclass == "13780") { for (int i = 37; i < head.Length; i++) { fileclass += head[i].ToString(); }
if (fileclass != "1378097998476") fileclass = "13780"; } } catch { reader.Dispose(); reader.Close(); } finally { reader.Dispose(); reader.Close(); } return fileclass; /*文件擴展名說明 * 255216 jpg * 208207 doc xls ppt wps * 8075 docx pptx xlsx zip * 5150 txt * 8297 rar * 7790 exe * 3780 pdf * * 4946/104116 txt * 7173 gif * 255216 jpg * 13780 png * 1378097998476 apng * 6677 bmp * 239187 txt,aspx,asp,sql * 208207 xls.doc.ppt * 6063 xml * 6033 htm,html * 4742 js * 8075 xlsx,zip,pptx,mmap,zip * 8297 rar * 01 accdb,mdb * 7790 exe,dll * 5666 psd * 255254 rdp * 10056 bt種子 * 64101 bat * 4059 sgf */ }
最終返回 1378097998476 就是png動圖(apng格式,注意擴展名仍是png),而普通png圖片爲 13780