【原創】區分png圖片格式和apng圖片格式的解決辦法

最近公司有個項目,要抓取客戶微信公衆號的文章,以及文章內容中的圖片,而且在圖片加上客戶本身的水印。咱們使用阿里雲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

相關文章
相關標籤/搜索