最近公司有个项目,要抓取客户微信公众号的文章,以及文章内容中的图片,并且在图片加上客户自己的水印。我们使用阿里云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. Android JNI so库的开发

    build.gradle的配置 apply plugin: 'com.android.application'android { compileSdkVersion 26 buildToolsVers ...

  2. angular4.0配置本机IP访问项目

    一.查看本机IP 命令行输入 ipconfig,在面板中选择IPv4地址 二.在项目中配置IP 打开package.json文件,修改如下 三.命令行运行 npm start 四.在手机上访问 192 ...

  3. NUnit实战,第一个测试类,测试事件触发是否是并行的

    以前测试都是新建一个控制台测试的方式来进行,感觉版本管理啥的非常麻烦.也是非常原始的办法.后来想以前有写过测试单元,不过好久没弄了.Nuget了NUnit后写了正式的第一个测试类. 测试用例: 测试事 ...

  4. Mtklog 分析(学习)

    常见log异常类型: JE  NE KE EE(external(modem) exception) 一.常见应用异常搜索关键信息 1. 常见应用crash的(系统提示***已停止运行) ,可以在ma ...

  5. SQLite事务与自增深度分析

    SQLite什么都好,就怕“database is locked”这些年来想尽办法去规避它. 测试代码: static void Test2() { XCode.Setting.Current.Tra ...

  6. LevelDB的源码阅读(三) Put操作

    在Linux上leveldb的安装和使用中我们写了这么一段测试代码,内容以及输出结果如下: #include <iostream> #include <string> #inc ...

  7. AssertionError while merging cells with xlwt (Python)

    产生这一错误的原因是,行列数字的赋值有问题,三行数字大于下行数字,左列数字大于右列数字. sheet.write_merge(top_row, bottom_row, left_column, rig ...

  8. iOS 动画篇 (三) CADisplayLink与CoreGraphics实现动画

    本文主要介绍利用CoreGraphics和CADisplayLink来实现一个注水动画.来一个效果图先: 在介绍注水动画前,先介绍利用CoreGraphics实现进度条的绘制. 一.扇形进度绘制 效果 ...

  9. [小程序开发] 微信小程序audio音频播放组件+api_wx.createAudioContext

    引言: audio是微信小程序中的音频组件,可以轻松实现小程序中播放/停止音频等自定义动作. 附上微信小程序audio组件的相关属性说明:https://mp.weixin.qq.com/debug/ ...

  10. bzoj:3616: War

    Description 小x所在的世界正在经历一场在k个阵营之间的战争.每个阵营有若干个炮塔,每个炮塔由攻击系统和防御系统组成.第i个炮塔可以攻击到离它欧几里德距离小于等于ri 或者曼哈顿距离小于等于 ...