通常是通过文件后缀名查找图片文件,如果没有文件后缀的图片或者伪造的图片文件,则这种判定方法将达不到要求。我们可以根据读取文件头进行图片文件类型的判定。

  比较流行的图片文件类型有:jpg png bmp gif 这几种,下面将介绍区分这几种图片的方式:

  BMP (bmp)  文件头(2 byte):   0x42,0x4D

  JPEG (jpg)  文件头(3 byte):   0xFF,0xD8,0xFF

  PNG (png)  文件头(4 byte):  0x89,0x50,0x4E,0x47

  GIF (gif)     文件头(4byte):    0x47,0x49,0x46,0x38

  应用程序通过可以读取文件头进行匹配。linux 下测试例子:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <unistd.h>
  5. #include <sys/types.h>
  6. #include <sys/stat.h>
  7. #include <dirent.h>
  8.  
  9. int main(int argc, const char *argv[])
  10. {
  11. int ret = ;
  12. DIR * dir;
  13. struct dirent * info;
  14. // int i=0;
  15.  
  16. if(argc != ){
  17. printf("Usage: %s /path/to/file",argv[]);
  18. return -;
  19. }
  20.  
  21. dir = opendir(argv[]);
  22. if(!dir){
  23. perror("opendir");
  24. return -;
  25. }
  26.  
  27. while((info = readdir(dir)) != NULL){
  28. struct stat file_sta;
  29. ret = stat(info->d_name,&file_sta);
  30. if(ret < ){
  31. perror("stat");
  32. return -;
  33. }
  34.  
  35. if(S_ISREG(file_sta.st_mode)){
  36. printf("%s \n",info->d_name);
  37. FILE *fp = fopen(info->d_name,"rb");
  38. if(!fp){
  39. perror("fopen");
  40. continue;
  41. }
  42. // 此处的类型定义必须定义为 unsigned 类型 (不然编译器会当做有符号类型处理)
  43. unsigned char buf[] = {};
  44. ret = fread(buf,,,fp);
  45.  
  46. if((buf[] == 0x42) && (buf[] == 0x4D)){
  47. printf("file type(bmp) : %s \n",info->d_name);
  48. }
  49. else if((buf[] == 0xFF) && (buf[] == 0xD8) && (buf[] == 0xFF)){
  50. printf("file type(jpg) : %s \n",info->d_name);
  51. }
  52. else if((buf[] == 0x89) && (buf[] == 0x50) && (buf[] == 0x4e) && (buf[] == 0x47)){
  53. printf("file type(png) : %s \n",info->d_name);
  54. }
  55. else if((buf[] == 0x47) && (buf[] == 0x49) && (buf[] == 0x46) && (buf[] == 0x38)){
  56. printf("file type(gif) : %s \n",info->d_name);
  57. }
  58. else{
  59.  
  60. }
  61. fclose(fp);
  62. }
  63. }
  64.  
  65. closedir(dir);
  66.  
  67. return ;
  68. }

  

  运行结果:

linux 下查找图片文件方法的更多相关文章

  1. Linux下查找大文件以及目录

    转自:http://www.cnblogs.com/kerrycode/p/4391859.html 在Windows系统中,我们可以使用TreeSize工具查找一些大文件或文件夹,非常的方便高效,在 ...

  2. linux下查找某个文件位置的方法

    一.通过文件名查找法: 举例说明,假设你忘记了httpd.conf这个文件在系统的哪个目录 下,甚至在系统的某个地方也不知道,则这是可以使用如下命令: find / -name httpd.conf ...

  3. Linux下查找大文件,大目录的方法

    查找大文件 //列举出当前目录所有大于800M的文件 find . -type f -size +800M 1 2 第一个方法只用到了一个命令find,它能够帮我们做一些文件查找的操作.它常用的参数有 ...

  4. linux下查找某个文件

    参考http://blog.csdn.net/gray13/article/details/6365654 一.通过文件名查找法: 举例说明,假设你忘记了httpd.conf这个文件在系统的哪个目录 ...

  5. Linux下打开超大文件方法

    在Linux下用VIM打开大小几个G.甚至几十个G的文件时,是非常慢的. 这时,我们可以利用下面的方法分割文件,然后再打开. 1 查看文件的前多少行 head -10000 /var/lib/mysq ...

  6. LINUX下查找大文件及大的文件夹

    原帖地址:https://www.cnblogs.com/iyoume2008/p/6105590.html 今天正好碰到这样的问题,在博客园中看到有以上地址的一篇文章,照着上面的操作解决了问题,但是 ...

  7. Linux下查找最大文件

    当我们应用一段时间以后,Linux可能会变得臃肿了,那么,怎么找出一个“path”下的最大文件呢? 可以使用du命令,如: du -sh [dirname|filename] 如:当前目录的大小: d ...

  8. linux下查找某文件关键字

    -e表示罗列出与关键字有关的行,“ABC”表示查找的关键字,/XXX/4.assoc.linear表示该路径下的文件 .assoc.linear

  9. linux下查找某文件关键字(grep 函数)

    -e表示罗列出与关键字有关的行,“ABC”表示查找的关键字,/XXX/4.assoc.linear表示该路径下的文件 .assoc.linear

随机推荐

  1. 201521123013 《Java程序设计》第13周学习总结

    1. 本周学习总结 2. 书面作业 Q1. 网络基础 1.1 比较ping www.baidu.com与ping cec.jmu.edu.cn,分析返回结果有何不同?为什么会有这样的不同? ping值 ...

  2. 201521123011《Java程序设计》 第12周学习总结

    1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结多流与文件相关内容. 2. 书面作业 将Student对象(属性:int id, String name,int age,doubl ...

  3. Java、javax、org、sun、Java.util等常用包的区别、详解、实例

    Java.javax.org.sun包都是jdk提供的类包,且都是在rt.jar中.rt.jar是JAVA基础类库(java核心框架中很重要的包),包含lang在内的大部分功能,而且rt.jar默认就 ...

  4. 06jQuery-05-事件

    不同的浏览器绑定事件的代码都不太一样,所以我们使用jQuery来写代码的话,可以屏蔽不同浏览器之间的差异. 在jQuery中,可以使用 on 来绑定一个事件,指定事件的名称和对应的处理函数: // 获 ...

  5. 《Head First 设计模式》读书笔记(1) - 策略模式

    <Head First 设计模式>(点击查看详情) 1.写在前面的话 之前在列书单的时候,看网友对于设计模式的推荐里说,设计模式的书类别都大同小异,于是自己就选择了Head First系列 ...

  6. java线程池相关知识点总结

    Android中常见到的很多通用组件一般都离不开"池"的概念,如各种图片加载库,网络请求库,即使Android的消息传递机制中的Meaasge当使用Meaasge.obtain() ...

  7. .NET Core 使用RabbitMQ

    RabbitMQ简介 AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计.消息中间件主要用于组件之间的 ...

  8. 非position:fixed,footer自動調到屏幕底部

    一.980px手機端寫法: $(function(){        var sh=$('section').height();     var ww=$(window).width();       ...

  9. vue 2 使用Bus.js进行兄弟(非父子)组件通信 简单案例

    vue2中废弃了$dispatch和$broadcast广播和分发事件的方法.父子组件中可以用props和$emit().如何实现非父子组件间的通信,可以通过实例一个vue实例Bus作为媒介,要相互通 ...

  10. js 倒计时(服务器时间同步)

    首先说一下,为什么要服务器时间同步, 因为服务器时间和本地电脑时间存在一定的时间差.有些对时效性要求非常高的应用,例如时时彩开奖,是不能容忍这种时间差存在的. 方案1:每次倒计时去服务端请求时间 // ...