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();
- jquery操作DOM 元素(3)
- 腾讯汤道生对话牛津大学互联网研究院Luciano:大数据将如何改变世界
- 分享本站右侧 “类Metro风格侧边栏” 的实现方法
- [C#1] 1-Hello World
- 代码审查工具StyleCop
- 实用工具特别推荐 Robocopy GUI
- 七牛镜像存储 WordPress 插件 的代码化
- WordPress 会自动压缩JPEG 格式的图像?
- jquery操作DOM 元素(2)
- WordPress 中部署真正的懒加载(Lazy Load)
- 图形化的2008R2 Server Core 配置管理工具
- 各种浏览器的userAgent
- WordPress 根据浏览器 user-agent 按需加载CSS 文件
- memcached的最新状态
- 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 文档注释
- Linux crond 计划任务添加
- linux 环境下安装使用 git
- linux下禁止root ssh远程登录和添加允许新用户登录ssh
- Python 常见数据结构整理
- mapreduce的二次排序-分区分组
- GATK RNA-Seq Snps Indel 分析
- 【技术创作101训练营】腾讯云主机上部署 FRP+Teamviewer 穿透内网进行远程运维
- 图像处理笔记(7)---- OpenCV 绘制无填充矩形
- 图像处理笔记(8)---- OpenCV 获取追踪对象的HSV值
- (数据科学学习手札95)elyra——jupyter lab平台最强插件集
- Python 序列化/反序列化自定义类型
- Windows10下使用VS2017编译和使用yaml-cpp库
- CentOS7下编译yaml-cpp库
- SAP Spartacus CurrentProductService返回的null对象
- SAP Spartacus产品明细页面用Observable显示产品名称