java如何根据二进制流确定图片的类型
时间:2022-04-29
本文章向大家介绍java如何根据二进制流确定图片的类型,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
为什么需要这样做?
因为仅仅通过后缀名我们并不能得知用户是否把图片的类型更改为其他类型.
public enum ImageType {
PNG('P','N','G','-',"PNG"),
JPG('J','F','I','F',"JPG"),
GIF('G','I','F','-',"GIF");
private char begin, mid, end, last;
private String type;
private ImageType(char begin, char mid, char end, char last, String type){
this.begin = begin;
this.mid = mid;
this.end = end;
this.last = last;
this.type = type;
}
/**
* 获取图片类型
* @param data
* @return
*/
public static ImageType getImageType(byte[] data) {
// Png:
if (PNG.getBegin() == data[1] && PNG.getMid() == data[2] && PNG.getEnd() == data[3]) {
return PNG;
}
// Gif:
if (GIF.getBegin() == data[0] && GIF.getMid() == data[1] && GIF.getEnd() == data[2]) {
return GIF;
}
// JPG:
if (JPG.getBegin() == data[6] && JPG.getMid() == data[7] && JPG.getEnd() == data[8]
&& JPG.getLast() == data[9]) {
return JPG;
}
return null;
}
}
//把JPG图片的后缀改成txt
public static void main(String[] args) throws Exception {
FileInputStream fs = new FileInputStream("d:\Koala.txt");
byte[] data = new byte[10];//读10个长度就够了
fs.read(data);
System.out.println(ImageType.getImageType(data));
fs.close();
}
控制台依然输出:
JPG
改进:因为文件流的前10个位置是保存的文件类型的信息根据这个规律:
public enum FileType2 {
FILE;
private static final Map<String, String> FILE_TYPES;
static {
FILE_TYPES = new HashMap<String, String>();
FILE_TYPES.put("PNG", "PNG");
FILE_TYPES.put("JFIF", "JPG");
FILE_TYPES.put("GIF", "GIF");
FILE_TYPES.put("PDF", "PDF");
}
/**
* 从集合中取得相应类型
*
* @param target
* @return
*/
public static String getType(String target) {
if (isEmpty(target)) {
return null;
}
String result = null;
for (String key : FILE_TYPES.keySet()) {
if (!contains(target, key)) continue;
result = FILE_TYPES.get(key);
break;
}
return result;
}
/**
* 是否包含
*
* @param str
* @param searchStr
* @return
*/
private static boolean contains(String str, String searchStr) {
if (str == null || searchStr == null) {
return false;
}
return str.indexOf(searchStr) >= 0;
}
/**
* 是否为空
*
* @param str
* @return
*/
private static boolean isEmpty(String str) {
return str == null || str.length() == 0;
}
}
测试:
FileInputStream fs = new FileInputStream("d:\Koala.JPG");
byte[] data = new byte[10];// 读10个长度就够了
fs.read(data);
StringBuilder str = new StringBuilder("");
for (int i = 0; i < data.length; i++) {
str.append((char) data[i]);
// System.out.println(i + ":" + (char) data[i]);
}
System.out.println("------------------");
System.out.println(FileType2.getType(str.toString()));
// System.out.println("文件类型:"+ImageType.getImageType(data).getType());
fs.close();
- C++服务器开发之基于对象的编程风格
- The jQuery UI CSS Framework
- hadoop:将WordCount打包成独立运行的jar包
- Hadoop: MapReduce2多个job串行处理
- UE4新手引导之下载和安装虚幻4游戏引擎
- mac 下卸载mysql的方法
- ZooKeeper 笔记(1) 安装部署及hello world
- mybatis 使用经验小结
- ZooKeeper 笔记(2) 监听数据变化
- 使用C# 和Consul进行分布式系统协调
- 设置 java -jar 的进程显示名称
- 爱浪携手豆瓣内容、腾讯共同发布AI语音耳机
- Win.ini和注册表的读取写入
- ZooKeeper 笔记(4) 实战应用之【消除单点故障】
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- 利用SurfaceView实现下雨与下雪动画效果详解(Kotlin语法)
- Android WebView的使用方法及与JS 相互调用
- Android标题栏上添加多个Menu按钮的实例
- Android编程解析XML文件的方法详解【基于XmlPullParser】
- 教你3分钟了解Android 简易时间轴的实现方法
- Android网络技术HttpURLConnection详解
- Ubuntu16.04下CUDA8.0和CUDA9.0共存
- Ubuntu 20.04 开启隐藏录音降噪功能(推荐)
- 解密 Linux 版本信息的方法
- ubuntu20.04连接wifi的方法(2种)
- 服务器Centos部署MySql并连接Navicat过程详解
- Android横竖屏幕切换生命周期详解
- LINUX中如何查看某个端口是否被占用的方法
- Android实现RecyclerView添加分割线的简便方法
- Android定时器Timer的停止和重启实现代码