技术概述

获取图片中拍摄 经度,纬度,拍摄地点、拍摄时间、上传时间、使用设备名、文件名、文件大小等信息

代码内容

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 读取图片信息相关推荐

  1. java读取tif图片_java读取tiff格式图片信息的方式。

    java读取tiff图片信息,其实也挺简单的,用xmpcore.jar可以解析. File jpegFile = new File("D:\\1.tif"); Metadata m ...

  2. java 读取txt,java读取大文件

    java 读取txt,java读取大文件 package com.bbcmart.util; import java.io.File; import java.io.RandomAccessFile; ...

  3. Java读取property配置文件

    读取配置文件已经成了Java程序员工作的一项必备技能. 配置文件的优点: 可维护性好 怎么个可维护性好呢? 它会让程序中变化的地方很灵活的配置,不需要修改代码. Java程序部署到服务器上去之后就变成 ...

  4. Java 读取 dwg 转换 dxf

    2019独角兽企业重金招聘Python工程师标准>>> kabeja-0.4.jar 1.java  读取  dxf  字符 @Testpublic void JunitGetCon ...

  5. java读取txt文件中的内容

    java读取txt文档中的内容:在这个地方我们输入一个txt文件的路径,就可以读取出txt文档中的内容: public static String readStringFromtxt(String t ...

  6. java读取ES配置生成ES管理类,获取ES连接

    java读取ES配置生成ES管理类,获取ES连接 1.Elasticsearch是基于Lucene开发的一个分布式全文检索框架,向Elasticsearch中存储和从Elasticsearch中查询, ...

  7. Java基础学习总结(15)——java读取properties文件总结

    2019独角兽企业重金招聘Python工程师标准>>> 一.java读取properties文件总结 在java项目中,操作properties文件是经常要做的,因为很多的配置信息都 ...

  8. java读取本地文件_java 读取本地文件实例详解

    java 读取本地文件实例详解 用javax.xml.w3c解析 实例代码: package cn.com.xinli.monitor.utils; import org.w3c.dom.Docume ...

  9. java读取jsp文件内容_使用Java读取Excel文件内容

    问题:我能用Java读取一个Excel文件吗?如果能,怎么做? 回答:是的,可以用Java读取Microsoft Excel文件.微软提供了一个Excel的ODBC驱动程序,因此我们就可以使用JDBC ...

最新文章

  1. 这些 Shell 分析服务器日志命令集锦,收藏好
  2. 单链表的基本操作(增删查总结)
  3. golang设计模式之原型模式
  4. Ubuntu 16.04安装VirtualBox 5.1实现无缝模式
  5. ios 的touch事件分析
  6. html中 一条样式规则,css规则的基本格式是什么?
  7. Android 12发布!小米11全系、Redmi K40 Pro宣布首批支持
  8. Vue学习笔记(六) 表单输入绑定
  9. Linux下搭建AP
  10. Numpy的学习6-深浅赋值(copydeep copy)
  11. 2.ActiveMQ下载和安装(Linux版)
  12. 一步一图一代码,一定要让你真正彻底明白红黑树
  13. (全网首发)谢惠民答案------谢惠民上下册习题解析
  14. 使用ARouter进行Android模块化开发,详解系列文章
  15. 什么是架构?怎么进行架构设计
  16. (一)航空发动机强度与振动复习纲要
  17. [读后感-Cayden原创] 读《1-2年纪,塑造孩子一生的关键》有感
  18. 再谈 RocketMQ broker busy(实战篇)
  19. 实现安卓直播-第三方平台(暴风云视频直播)
  20. Make WeChat Great Again

热门文章

  1. Tkinter笔记(2)——组件属性
  2. 如何创建项目变更管理流程?
  3. 8个影响我职业生涯的重要技能
  4. 研究生迎新晚会计算机学院祝福语,[迎新晚会家长祝福语]迎新晚会祝福语
  5. IP、邮箱、ICON图标收集实战
  6. 【ae】蒙版形状变换的顶点对齐
  7. JVM GC之对象生死
  8. Fusion360学习记录:虎符
  9. 腾讯优测优社区干货精选|手Q红包后台设计
  10. BS-1python基础知识-1.19数据文件的读写