【原创】区分png图片格式和apng图片格式的解决办法
最近公司有个项目,要抓取客户微信公众号的文章,以及文章内容中的图片,并且在图片加上客户自己的水印。我们使用阿里云OSS存储图片和加水印,发现真心好用,提升了我们的开发效率,阿里云现在是越来越强大了...... 不废话,继续正题......
原本想得很简单,gif图片不打水印,其它图片格式都加。判断文件类型的方法,参考了园子里的做法:
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 = ; i < ; i++)
{
fileclass += reader.ReadByte().ToString();
} }
catch (Exception)
{ throw;
} if (fileclass == "")
{
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格式,在文件结构上是有区别的。网上查了下,也验证了我的想法是对的。
首先:维基百科上的描述够专业 https://en.wikipedia.org/wiki/APNG (E文不好,软件翻译下)


其次,CSDN上郭晓东专栏,对PNG格式解释得够清楚了(虽然有些没看懂)
http://blog.csdn.net/hherima/article/details/45847043
http://blog.csdn.net/hherima/article/details/45848171
于是照猫画虎找了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();
for (int i = ; i < ; i++)
{
fileclass += head[i].ToString();
} if (fileclass == "")
{
for (int i = ; 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
【原创】区分png图片格式和apng图片格式的解决办法的更多相关文章
- C# WebAPI中DateTime类型字段在使用微软自带的方法转json格式后默认含T的解决办法
原文:C# WebAPI中DateTime类型字段在使用微软自带的方法转json格式后默认含T的解决办法 本人新手,在.Net中写WebAPI的时候,当接口返回的json数据含有日期时间类型的字段时, ...
- 前端问题——png图片在IE6下透明失效,解决办法
今天,一位同事问我问题,png 图片在IE6下透明背景失效. 解决办法,在网上查了很多,最后还是采用两种方案来解决这个问题 1.把这个网页的png格式图片变更为gif格式的图片.问题解决 2.就是让这 ...
- SpringBoot集成百度UEditor图片上传后直接访问404解决办法
SpringBoot项目上传图片一般是上传至远程服务器存储,开发过程中可能会上传至当前项目的某个静态目录中,此时就会遇到这个问题,文件在上传之后直接访问并不能被访问到,必须重新加载项目. 首先分析一下 ...
- Android之com.nostra13.universalimageloader加载图片抛出OutOfMemroyError错误的多种解决办法
com.nostra13.universalimageloader是用来加载图片非常好的框架,但是也有问题,一旦图片过多的话,很容易就会提示OutOfMemroyError错误,也就是内存溢出的问题, ...
- img图片下面出现莫名的下边距解决办法
图片底部的空隙实际上涉及行内元素的布局模型,图片默认的垂直对齐方式是基线,而基线的位置是与字体相关的.所以在某些时候,图片底部的空隙可能是 2px,而有时可能是 4px 或更多.不同的 font-si ...
- angularjs图片上传后不刷新的解决办法
刚接触angularjs在使用的过程中遇到这个问题 首先我们的图片地址是根据ID来获取的,所以用了指令来完成图片的绑定 .directive("cImg", ['appUrl', ...
- SpringMVC中css,js,图片等静态资源被拦截的解决办法
一.静态资源的存放路径 css,js,图片等静态资源存放在项目的路径必须为 二.html.jsp导入静态资源文件 html.jsp页面中的导入静态资源文件: js: css: 图片: 二.web.xm ...
- 使用Photoshop不改变图片尺寸,保存图片到30K以下的解决办法
- vue请求网络图片403错误,图片有占位但是显示不出来解决办法
在index.html 增加一个meta标签 <meta name="referrer" content="no-referrer" />
随机推荐
- ES6小点心之通用弹窗
小点心,顾名思义,开箱即食,拿来即用. 前端业务逻辑主要分为[交互效果]和[数据展示]两方面.数据展示可使用 MVVM 框架来实现.前端的交互效果常用的也就那么几种,比如弹窗,楼层定位,倒计时,下拉刷 ...
- linux rsync服务
1.rsync介绍rsync是一个开源的,快速的,多功能的,可实现全量及增量的本地或远程数据同步备份的优秀工具,rsync软件适用于nunix/linux/windows多操作系统上运行.官方网站:h ...
- WPF获取窗口句柄的方法
通过WPF的互操作帮助类WindowInteropHelper,相关连接:https://msdn.microsoft.com/zh-cn/library/system.windows.interop ...
- findhex
FindPattern(hD3D, 0x128000, (PBYTE)"\xC7\x06\x00\x00\x00\x00\x89\x86\x00\x00\x00\x00\x89\x86&qu ...
- web服务器,应用程序服务器,http服务器的区别
WEB服务器.应用程序服务器.HTTP服务器有何区别?IIS.Apache.Tomcat.Weblogic.WebSphere都各属于哪种服务器? 这个概念很重要. Web服务器的基本功能就是提供We ...
- CSS中的块级元素(block)与行内元素(inline)
css中有3种基本的定位机制:普通流(相对定位实际上看做普通流定位模型的一部分)浮动(float)绝对定位(固定定位是绝对定位的一种)所以在学习浮动之前,我们先要了解块级元素与内联元素(行内元素).块 ...
- CentOS7配置静态IP
确保是在root用户下进行操作,首先进入network-scripts目录 cd /etc/sysconfig/network-scripts/ 通过ls列出该目录下的所有文件,其中"ifc ...
- Educational Codeforces Round 34
F - Clear The Matrix 分析 题目问将所有星变成点的花费,限制了行数(只有4行),就可以往状压DP上去靠了. \(dp[i][j]\) 表示到第 \(i\) 列时状态为 \(j\) ...
- Java与算法之(7) - 完全二叉树
树 下图是一"棵"树的样子.树这个名称起的很形象,整个数据结构由根.枝.叶组成,其中1为根节点,2.3是1的子节点,4.5.6.8.9.10这几个没有子节点的节点称为叶节点. 节点 ...
- metasploit联动beef启动
(温馨提示:请按照步骤来,否则beef到后面会启动不了) 我们首先进入vim /usr/share/beef-xss/config.yaml 找到metasploit把它改为启动 把false改为tr ...