Java 读取图片信息
技术概述
获取图片中拍摄 经度,纬度,拍摄地点、拍摄时间、上传时间、使用设备名、文件名、文件大小等信息
代码内容
1、WatermarkDto 信息实体类
import lombok.Data;@Data
public class WatermarkDto {private String equipmentName;//设备名private String aiteName; //文件名private String ammaterNumber;//电表编号private String fileSize;//文件大小private String latitude;//经度private String longitude;//纬度private String shotTime;//拍摄时间private String abootTime;//上传时间private String address;//地址
}
2、controller 文件内容
@RestController
@RequestMapping
@Api(value = "工具栏",produces = "/toolController")
public class ToolController {@Autowiredprivate ToolService toolService;public static final Logger logger = LoggerFactory.getLogger(ToolController.class);@GetMapping("/pictureInformation")@ApiOperation(notes = "pictureInformation",value = "获取图片经纬度")public RestResponse<WatermarkDto> pictureInformation(MultipartFile imager) {WatermarkDto watermarkDto = toolService.pictureInformation(imager);return RestResponse.ok(watermarkDto);}
}
3、service文件内容 编写逻辑内容 调用工具类 读取图片中的信息
@Slf4j
@Service
public class ToolService {
@Autowired
private PictureInformationUtil pictureInformationUtil;/*** 获取图片信息(处理后)* @param imager* @return*/public WatermarkDto pictureInformation(MultipartFile imager) {log.info("图片======="+imager);WatermarkDto watermarkDto = pictureInformationUtil.pictureInformation(imager);watermarkDto.setAddress(baiDuUtil.longitudeToAddress(watermarkDto.getLatitude(),watermarkDto.getLongitude()));return watermarkDto;}
}
4、PictureInformationUtil 获取图片信息工具类
import cn.pl.demon.dto.dto.prcture.PrctureMetadataDto;
import cn.pl.demon.dto.dto.prcture.WatermarkDto;
import com.drew.imaging.ImageMetadataReader;
import com.drew.imaging.ImageProcessingException;
import com.drew.imaging.jpeg.JpegMetadataReader;
import com.drew.imaging.jpeg.JpegProcessingException;
import com.drew.metadata.Directory;
import com.drew.metadata.Metadata;
import com.drew.metadata.Tag;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;/*** 图片或视频中提取EXIF,ICC等其他元数据信息*/
@Slf4j
@Component
public class PictureInformationUtil {@Autowiredprivate StringInterceptUtil stringInterceptUtil;@Autowiredprivate FileUtil fileUtil;/*** 获取图片中全部信息(未处理)* @param imager* @return* @throws Exception*/public List<PrctureMetadataDto> pictureInformationUtil(MultipartFile imager) throws Exception {List<PrctureMetadataDto> prctureMetadataDtoList = new ArrayList<>();Metadata metadata = JpegMetadataReader.readMetadata((InputStream) imager);//输出所有附加属性数据for (Directory directory : metadata.getDirectories()) {for (Tag tag : directory.getTags()) {log.info("名称:"+tag.getTagName()+"========内容:"+tag.getDescription());PrctureMetadataDto prctureMetadataDto = new PrctureMetadataDto();prctureMetadataDto.setName(tag.getTagName());prctureMetadataDto.setDescription(tag.getDescription());prctureMetadataDtoList.add(prctureMetadataDto);}}return prctureMetadataDtoList;}/*** 获取图片部分所需信息* @param imager* @return*/public WatermarkDto pictureInformation(MultipartFile imager){try {WatermarkDto watermarkDto = new WatermarkDto();Metadata metadata = ImageMetadataReader.readMetadata((File) imager);for(Directory directory : metadata.getDirectories()){for (Tag tag : directory.getTags()){//log.info("名称:"+tag.getTagName()+"========内容:"+tag.getDescription());//获取纬度if("GPS Latitude".equals(tag.getTagName())){log.info("获取纬度=="+tag.getDescription());watermarkDto.setLatitude(pointToLatlong(tag.getDescription()));}//获取经度if("GPS Longitude".equals(tag.getTagName())){log.info("获取经度=="+tag.getDescription());watermarkDto.setLongitude(pointToLatlong(tag.getDescription()));}//获取拍摄时间if("File Modified Date".equals(tag.getTagName())){watermarkDto.setAbootTime("上传时间:"+tag.getDescription());}//文件拍摄时间if("Date/Time".equals(tag.getTagName())){watermarkDto.setShotTime("拍摄时间:"+tag.getDescription());}//拍摄设备名if("Model".equals(tag.getTagName())){watermarkDto.setEquipmentName("设备名:"+tag.getDescription());}//获取文件名if("File Name".equals(tag.getTagName())){watermarkDto.setAiteName("文件名:"+tag.getDescription());}//文件大小if("File Size".equals(tag.getTagName())){//String size = tag.getDescription().substring(0,tag.getDescription().length()-6);String size = getNetFileSizeDescription(Long.parseLong(stringInterceptUtil.get_StringNum(tag.getDescription())));log.info(size);watermarkDto.setFileSize("文件大小:"+size);}}}return watermarkDto;} catch (JpegProcessingException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();} catch (ImageProcessingException e) {e.printStackTrace();}return null;}/*** 经纬度格式 转换为 度分秒格式转换* @param point 坐标点* @return*/public String pointToLatlong (String point ) {Double du = Double.parseDouble(point.substring(0, point.indexOf("°")).trim());Double fen = Double.parseDouble(point.substring(point.indexOf("°")+1, point.indexOf("'")).trim());Double miao = Double.parseDouble(point.substring(point.indexOf("'")+1, point.indexOf("\"")).trim());Double duStr = du + fen / 60 + miao / 60 / 60 ;return duStr.toString();}/*** 把byte转化为KB、MB、GB* @param size* @return*/public String getNetFileSizeDescription(long size) {StringBuffer bytes = new StringBuffer();DecimalFormat format = new DecimalFormat("###.00");if (size >= 1024L * 1024L * 1024L * 1024L) {double i = (size / (1024.0 * 1024.0 * 1024.0 * 1024.0));bytes.append(format.format(i)).append("TB");} else if (size >= 1024L * 1024L * 1024L) {double i = (size / (1024.0 * 1024.0 * 1024.0));bytes.append(format.format(i)).append("GB");} else if (size >= 1024L * 1024L) {double i = (size / (1024.0 * 1024.0));bytes.append(format.format(i)).append("MB");} else if (size >= 1024L) {double i = (size / (1024.0));bytes.append(format.format(i)).append("KB");} else if (size < 1024L) {bytes.append("0B");}return bytes.toString();}
}
5、StringInterceptUtil 校验截取字符串
@Slf4j
@Component
public class StringInterceptUtil {/*** 截取字符串内数字* @param string* @return*/public String get_StringNum(String string){String regEx = "[^0-9]";Pattern p =Pattern.compile(regEx);Matcher m = p.matcher(string);return m.replaceAll("").trim();}}
技术使用过程中遇到的问题以及解决过程
获取图片信息时发现,当下的网络图片里面只存在图片的上传与图片名称,只有用摄像的原图才可以获取上述的所有信息
技术总结
读取一个图片的信息 一般不会常用,反而是存储和上传图片使用较多,这只是个小练习!!!
最后本人是个小萌新,请大佬们多多指教!!!!!
Java 读取图片信息相关推荐
- java读取tif图片_java读取tiff格式图片信息的方式。
java读取tiff图片信息,其实也挺简单的,用xmpcore.jar可以解析. File jpegFile = new File("D:\\1.tif"); Metadata m ...
- java 读取txt,java读取大文件
java 读取txt,java读取大文件 package com.bbcmart.util; import java.io.File; import java.io.RandomAccessFile; ...
- Java读取property配置文件
读取配置文件已经成了Java程序员工作的一项必备技能. 配置文件的优点: 可维护性好 怎么个可维护性好呢? 它会让程序中变化的地方很灵活的配置,不需要修改代码. Java程序部署到服务器上去之后就变成 ...
- Java 读取 dwg 转换 dxf
2019独角兽企业重金招聘Python工程师标准>>> kabeja-0.4.jar 1.java 读取 dxf 字符 @Testpublic void JunitGetCon ...
- java读取txt文件中的内容
java读取txt文档中的内容:在这个地方我们输入一个txt文件的路径,就可以读取出txt文档中的内容: public static String readStringFromtxt(String t ...
- java读取ES配置生成ES管理类,获取ES连接
java读取ES配置生成ES管理类,获取ES连接 1.Elasticsearch是基于Lucene开发的一个分布式全文检索框架,向Elasticsearch中存储和从Elasticsearch中查询, ...
- Java基础学习总结(15)——java读取properties文件总结
2019独角兽企业重金招聘Python工程师标准>>> 一.java读取properties文件总结 在java项目中,操作properties文件是经常要做的,因为很多的配置信息都 ...
- java读取本地文件_java 读取本地文件实例详解
java 读取本地文件实例详解 用javax.xml.w3c解析 实例代码: package cn.com.xinli.monitor.utils; import org.w3c.dom.Docume ...
- java读取jsp文件内容_使用Java读取Excel文件内容
问题:我能用Java读取一个Excel文件吗?如果能,怎么做? 回答:是的,可以用Java读取Microsoft Excel文件.微软提供了一个Excel的ODBC驱动程序,因此我们就可以使用JDBC ...
最新文章
- 这些 Shell 分析服务器日志命令集锦,收藏好
- 单链表的基本操作(增删查总结)
- golang设计模式之原型模式
- Ubuntu 16.04安装VirtualBox 5.1实现无缝模式
- ios 的touch事件分析
- html中 一条样式规则,css规则的基本格式是什么?
- Android 12发布!小米11全系、Redmi K40 Pro宣布首批支持
- Vue学习笔记(六) 表单输入绑定
- Linux下搭建AP
- Numpy的学习6-深浅赋值(copydeep copy)
- 2.ActiveMQ下载和安装(Linux版)
- 一步一图一代码,一定要让你真正彻底明白红黑树
- (全网首发)谢惠民答案------谢惠民上下册习题解析
- 使用ARouter进行Android模块化开发,详解系列文章
- 什么是架构?怎么进行架构设计
- (一)航空发动机强度与振动复习纲要
- [读后感-Cayden原创] 读《1-2年纪,塑造孩子一生的关键》有感
- 再谈 RocketMQ broker busy(实战篇)
- 实现安卓直播-第三方平台(暴风云视频直播)
- Make WeChat Great Again