最近公司有个项目,要抓取客户微信公众号的文章,以及文章内容中的图片,并且在图片加上客户自己的水印。我们使用阿里云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图片格式的解决办法的更多相关文章

  1. C# WebAPI中DateTime类型字段在使用微软自带的方法转json格式后默认含T的解决办法

    原文:C# WebAPI中DateTime类型字段在使用微软自带的方法转json格式后默认含T的解决办法 本人新手,在.Net中写WebAPI的时候,当接口返回的json数据含有日期时间类型的字段时, ...

  2. 前端问题——png图片在IE6下透明失效,解决办法

    今天,一位同事问我问题,png 图片在IE6下透明背景失效. 解决办法,在网上查了很多,最后还是采用两种方案来解决这个问题 1.把这个网页的png格式图片变更为gif格式的图片.问题解决 2.就是让这 ...

  3. SpringBoot集成百度UEditor图片上传后直接访问404解决办法

    SpringBoot项目上传图片一般是上传至远程服务器存储,开发过程中可能会上传至当前项目的某个静态目录中,此时就会遇到这个问题,文件在上传之后直接访问并不能被访问到,必须重新加载项目. 首先分析一下 ...

  4. Android之com.nostra13.universalimageloader加载图片抛出OutOfMemroyError错误的多种解决办法

    com.nostra13.universalimageloader是用来加载图片非常好的框架,但是也有问题,一旦图片过多的话,很容易就会提示OutOfMemroyError错误,也就是内存溢出的问题, ...

  5. img图片下面出现莫名的下边距解决办法

    图片底部的空隙实际上涉及行内元素的布局模型,图片默认的垂直对齐方式是基线,而基线的位置是与字体相关的.所以在某些时候,图片底部的空隙可能是 2px,而有时可能是 4px 或更多.不同的 font-si ...

  6. angularjs图片上传后不刷新的解决办法

    刚接触angularjs在使用的过程中遇到这个问题 首先我们的图片地址是根据ID来获取的,所以用了指令来完成图片的绑定 .directive("cImg", ['appUrl', ...

  7. SpringMVC中css,js,图片等静态资源被拦截的解决办法

    一.静态资源的存放路径 css,js,图片等静态资源存放在项目的路径必须为 二.html.jsp导入静态资源文件 html.jsp页面中的导入静态资源文件: js: css: 图片: 二.web.xm ...

  8. 使用Photoshop不改变图片尺寸,保存图片到30K以下的解决办法

  9. vue请求网络图片403错误,图片有占位但是显示不出来解决办法

    在index.html 增加一个meta标签 <meta name="referrer" content="no-referrer" />

随机推荐

  1. angular4.0项目文件解读

    这篇文章我觉得是很有用的,便于我们对ng项目的理解,同时在配置项目时,也能够很快的定位到相应文件. 摘录的别人的文章,首先感谢那个路人兄弟,下面就开始学习吧. File 文件 Purpose 用途 e ...

  2. 【转】Appium的安装-Mac平台(命令行 dmg)

    其实Appium的安装方式主要有两种: 1)自己安装配置nodejs的环境,然后通过npm进行appium的安装 2)直接下载官网提供的dmg进行安装,dmg里面已经有nodejs的环境和appium ...

  3. inline-block元素间留白现象探究

    现象说明 最近在项目发布的时候遇到了一个奇怪的问题,在项目使用gulp打包压缩后发现之前一些行内元素间的空白消失了,导致页面中一些布局出现了问题 正常样式如下:    最开始出现这个问题的时候以为是g ...

  4. 数据结构-堆(应用篇)之堆排序法-C和C++的实现

    堆排序 关于堆的内容我们已经在上一节中了解了,本节中将给出一个堆的应用-堆排序. 关于堆的概念可以看上一节,入口:http://www.cnblogs.com/HongYi-Liang/p/78536 ...

  5. [已解决]IndentationError: unindent does not match any outer indentation level

    最近跟同事合作代码没有用git进行协同,很多代码拷贝后进行粘贴,常常报以上错误. 经过查询发现是空格跟tab混合使用了,重新将代码的缩进手动调整下就好了.

  6. Zabbix实战-简易教程(8)--添加item

    一.术语 1.1 Item概念 Item是从主机里面获取的所有数据.通常情况下 item称为监控项,例如我们host加入了 zabbix 监控,我们需要监控它的内存.CPU信息,那么获取的CPU或内存 ...

  7. Linux下zeromq.js安装

    本文章主要阐述在离线环境下安装zeromq.js的方法和步骤.zeromq.js下载地址: https://www.npmjs.com/package/zeromq或者 https://github. ...

  8. JavaScript中的this(你不知道的JavaScript)

    JavaScript中的this,刚接触JavaScript时大家都在大肆渲染说其多么多么的灵巧重要,然而自己并不关心:随着自己对JavaScript一步步深入了解,突然恍然大悟,原来它真的很重要!所 ...

  9. Codeforces Round #356 (Div. 1) C. Bear and Square Grid

    C. Bear and Square Grid time limit per test 3 seconds memory limit per test 256 megabytes input stan ...

  10. Gym 100952A&&2015 HIAST Collegiate Programming Contest A. Who is the winner?【字符串,暴力】

    A. Who is the winner? time limit per test:1 second memory limit per test:64 megabytes input:standard ...