`
wangcheng2008china
  • 浏览: 15449 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

java获取文件exif信息-添加图片文字水印

阅读更多
需要添加jar:metadata-extractor-2.3.1.jar
代码:
public class ImageInfo {
	private Integer id;
	private String author;
	private String desc;
	private String date;
	private String width;
	private String height;
	public ImageInfo(Integer id, String author, String desc,String date) {
		super();
		this.id = id;
		this.author = author;
		this.desc = desc;
		this.date=date;
	}
	public ImageInfo(String author, String desc) {
		super();
		this.id = 0;
		this.author = author;
		this.desc = desc;
	}
	public ImageInfo() {
		super();
		// TODO Auto-generated constructor stub
	}
	/**
	 * @return the id
	 */
	public Integer getId() {
		return id;
	}
	/**
	 * @param id the id to set
	 */
	public void setId(Integer id) {
		this.id = id;
	}
	/**
	 * @return the author
	 */
	public String getAuthor() {
		return author;
	}
	/**
	 * @param author the author to set
	 */
	public void setAuthor(String author) {
		this.author = author;
	}
	/**
	 * @return the desc
	 */
	public String getDesc() {
		return desc;
	}
	/**
	 * @param desc the desc to set
	 */
	public void setDesc(String desc) {
		this.desc = desc;
	}
	
	
	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	
	/**
	 * @return the date
	 */
	public String getDate() {
		return date;
	}
	/**
	 * @param date the date to set
	 */
	public void setDate(String date) {
		this.date = date;
	}
	 
	/**
	 * @return the width
	 */
	public String getWidth() {
		return width;
	}
	/**
	 * @param width the width to set
	 */
	public void setWidth(String width) {
		this.width = width;
	}
	/**
	 * @return the height
	 */
	public String getHeight() {
		return height;
	}
	/**
	 * @param height the height to set
	 */
	public void setHeight(String height) {
		this.height = height;
	}
	/* (non-Javadoc)
	 * @see java.lang.Object#toString()
	 */
	@Override
	public String toString() {
		return "ImageInfo [id=" + id + ", author=" + author + ", desc=" + desc
				+ ", date=" + date + ", width=" + width + ", height=" + height
				+ "]";
	}
	 
	
	
}



public static void createMark(String souchFilePath, String targetFilePath,
         String markContent, Color markContentColor, float qualNum,
         String fontType, int fontSize) {
       
        markContentColor = Color.red;
        ImageIcon imgIcon = new ImageIcon(souchFilePath);
        Image theImg = imgIcon.getImage();
        // Image可以获得 输入图片的信息
        int width = theImg.getWidth(null);
        int height = theImg.getHeight(null);

        // 800 800 为画出图片的大小
        BufferedImage bimage = new BufferedImage(width, height,
          BufferedImage.TYPE_INT_RGB);
        // 2d 画笔
        Graphics2D g = bimage.createGraphics();
        g.setColor(markContentColor);
        g.setBackground(Color.white);

        // 画出图片-----------------------------------
        g.drawImage(theImg, 0, 0, null);
        // 画出图片-----------------------------------

        // --------对要显示的文字进行处理--------------
        AttributedString ats = new AttributedString(markContent);
        Font f = new Font(fontType, Font.BOLD, fontSize);
        ats.addAttribute(TextAttribute.FONT, f, 0, markContent.length());
        AttributedCharacterIterator iter = ats.getIterator();
        // ----------------------
        int wd = getLength(markContent) * fontSize;
        g.drawString(iter, width-wd-fontSize-fontSize,
          height - 40);
        // 添加水印的文字和设置水印文字出现的内容 ----位置
        g.dispose();// 画笔结束
        try {
         // 输出 文件 到指定的路径
         FileOutputStream out = new FileOutputStream(targetFilePath);
         JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);

         JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(bimage);

         param.setQuality(qualNum, true);
         encoder.encode(bimage, param);
         out.close();
        } catch (Exception e) {
         e.printStackTrace();
        }
     }
     
     
     public static int getLength(String str){
		 int wd = 0;
		 int p = 0;
		 int s = 0;
		 for (int i = 0; i < str.length(); i++){
			    char c = str.charAt(i);
			    if ((c >= 0x4e00)&&(c <= 0x9fbb)){
			    	s++;
			    }else{
			    	p++;
			    }
			}
		 wd = s + p/2;
		 return wd;
	 }



 public static ImageInfo getImageInfo(String filePath){
		 ImageInfo imageInfo = new ImageInfo();
		 File jpegFile = new File(filePath);
         Metadata metadata = null ;
		try {
			metadata = JpegMetadataReader.readMetadata(jpegFile);
			Directory exif = metadata.getDirectory(ExifDirectory.class);
	         Iterator tags = exif.getTagIterator();
	         while (tags.hasNext()) {
	             Tag tag = (Tag)tags.next();
	             if(tag.getTagType()==ExifDirectory.TAG_WIN_COMMENT){
	            	 imageInfo.setDesc(tag.getDescription());
	             }
	             if(tag.getTagType()==ExifDirectory.TAG_WIN_AUTHOR){
	            	 imageInfo.setAuthor(tag.getDescription());
	             }
	             if(tag.getTagType()==ExifDirectory.TAG_DATETIME){
	            	 imageInfo.setDate(tag.getDescription().substring(0,10).replace(":","."));
	             }
	             if(tag.getTagType()==ExifDirectory.TAG_EXIF_IMAGE_WIDTH){
	            	 imageInfo.setWidth(tag.getDescription().substring(0,10).split(" ")[0]);
	             }
	             if(tag.getTagType()==ExifDirectory.TAG_EXIF_IMAGE_HEIGHT){
	            	 imageInfo.setHeight(tag.getDescription().substring(0,10).split(" ")[0]);
	             }
	         }
	         return imageInfo;
		} catch (JpegProcessingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (MetadataException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		 return null;
	 }
	
     public static void main(String[] args) throws Exception {
    	 String fileName = "DSC01221.JPG";
         String inFilePath = "F:/images/nice/" + fileName;
         String outFilePath = "F:/" + fileName;
         ImageInfo imageInfo = getImageInfo(inFilePath);
         System.out.println(imageInfo.toString());
         int p = Integer.parseInt(imageInfo.getWidth())/52;
         System.out.println(p);
         ImageUtils.createMark(inFilePath, outFilePath, imageInfo.getAuthor()+" "+imageInfo.getDesc()+" "+imageInfo.getDate(), null, 1, "",p);
     }




如有疑问,欢迎加入群:283948248 找群主
分享到:
评论

相关推荐

    图片批量处理器程序.zip

    4. **添加水印**:在每张图片上添加文字、图像水印,保护版权。 5. **滤镜应用**:应用各种视觉效果,如黑白、模糊、锐化等。 6. **元数据处理**:修改图片的EXIF信息,如拍摄日期、地点等。 7. **重命名**:批量...

    humbnailator-0.4.2.jar

    这个小巧的工具包不仅能够满足基本的图像缩放需求,还提供了丰富的图片处理选项,如添加水印、裁剪、旋转等,为Java开发者带来了极大的便利。 thumbnailator库的核心功能在于其出色的图片缩略图生成能力。它支持...

    imagemagick.zip

    6. **读写元数据**:ImageMagick允许读取和修改图像的元数据,包括EXIF信息、IPTC元数据等。 7. **脚本和编程接口**:除了命令行工具,ImageMagick还提供了一组编程接口(API),支持C、C++、Perl、Python、PHP、...

    移动开发_Android_基础框架_SAFApi组件开发_1742847786.zip

    移动开发_Android_基础框架_SAFApi组件开发_1742847786.zip

    《基于YOLOv8的气功动作识别系统》(包含源码、完整数据集、可视化界面、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    FourOnes_jquerybootstraptenine_1742855636.zip

    app开发

    MobaXterm安装包

    MobaXterm安装包

    30页-清华科技园智慧园区方案.pdf

    智慧园区,作为智慧城市的重要组成部分,正借助5G、云计算、大数据等前沿技术,实现园区的全面智慧化升级。它不仅仅是技术的堆砌,更是园区管理模式和服务理念的革新。智慧园区通过构建统一的大数据平台,实现园区内各类数据的整合与共享,让管理者能够全局掌握园区运营状态,实现人、事、物的穿透式管理。 在5G技术的加持下,智慧园区的特色应用得以更加广泛和深入地开展。从便捷通行到智慧物联,从楼宇自控到企业服务,5G智慧园区为园区内的企业和员工提供了前所未有的便捷与高效。刷脸通行、车牌识别、访客线上预约等技术的应用,不仅提升了园区的安全等级,更让通行变得简单快捷。而智慧垃圾桶、路灯等物联网设备的引入,则让园区的环境管理更加智能化、精细化。此外,5G智慧园区还通过无人机巡检、无人驾驶等创新应用,为园区的安全管理、物资配送等方面带来了全新的解决方案。 值得一提的是,智慧园区的建设并不仅仅局限于硬件设施的升级,更在于服务模式的创新。通过园区APP、在线服务平台等渠道,智慧园区实现了园区服务的线上化、便捷化,让企业和员工能够随时随地享受到园区提供的各类服务。这种以人为本的服务理念,不仅提升了园区的整体服务水平,更增强了园区的吸引力和竞争力。总之,5G智慧园区的建设为园区的可持续发展注入了新的活力,也为未来城市的发展提供了有益的借鉴和启示。

    C基础day9 思维导图

    C基础day9 思维导图

    Simulink仿真实现物体终端速度与信号处理的MATLAB代码解析(复现论文或解决问题,含详细可运行代码及解释)

    内容概要:本文档详细介绍了使用Simulink进行两个物理问题的仿真建模。第一个任务是模拟一个球体从高空落下的终端速度,通过建立重力与空气阻力的平衡模型,利用MATLAB代码构建Simulink模型,最终计算出终端速度。第二个任务是基于提供的加速度数据,通过两次积分计算物体的速度和位置,同样使用MATLAB代码实现了Simulink模型。每个任务都包含了详细的数学公式推导、参数设置以及Simulink模块的具体连接方法。仿真结果显示,终端速度约为53.6 m/s,而1秒后的速度和位置则取决于输入的加速度数据。 适合人群:对Simulink仿真工具感兴趣的工程技术人员、科研工作者以及相关专业的学生。 使用场景及目标:适用于需要进行物理系统仿真、信号处理的研究项目或教学实验。主要目标是帮助读者掌握Simulink的基本操作和应用技巧,同时加深对物理现象的理解。 其他说明:文中提供了完整的MATLAB代码,方便读者直接复制并在自己的环境中运行测试。此外,还给出了详细的中文注释,有助于初学者更好地理解各个步骤的功能和意义。

    《基于YOLOv8的隧道安全监测系统》(包含源码、完整数据集、可视化界面、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    音乐_安卓开发_本地音乐_播放器应用μsic_1742860435.zip

    音乐_安卓开发_本地音乐_播放器应用μsic_1742860435.zip

    Lightweight and Efficient: The backbone of the TTS Diffusion Transformer has only 0.45B param

    Lightweight and Efficient: The backbone of the TTS Diffusion Transformer has only 0.45B parameters. Ultra High-Quality Voice Cloning: See the demo video below! We also report results of recent TTS models on the Seed test sets in the following table. Bilingual Support: Supports both Chinese and English, and code-switching. Controllable: Supports accent intensity control and fine-grained pronunciation/duration adjustment (coming soon).

    博客_ionic20_移动端_应用开发模板_1742847485.zip

    博客_ionic20_移动端_应用开发模板_1742847485.zip

    《基于YOLOv8的传送带异物检测系统》(包含源码、完整数据集、可视化界面、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

    中继增强OFDMA网络中的公平半分布式资源分配方案实现与性能评估(复现论文,含详细可运行代码及解释)

    内容概要:本文详细介绍了复现论文《Fair Semi-distributed Resource Allocation Scheme over Relay-Enhanced OFDMA Networks》的代码实现。主要内容包括系统模型构建(定义基站、中继站、移动终端及其关联关系)、资源分配算法(半分布式资源分配、改进的两阶段资源分配)和公平性调度机制(吞吐量计算、效用函数)。此外,还进行了仿真实验,对比了所提方案与集中式方案和机会主义方案在吞吐量、公平性和反馈开销方面的性能表现。最后,通过随机分布场景下的仿真进一步验证了方案的有效性和实际部署的可行性。 适合人群:通信工程专业研究人员、无线网络优化工程师、对OFDMA技术和资源分配算法感兴趣的学者和技术人员。 使用场景及目标:适用于研究和开发中继增强的OFDMA网络资源分配算法,旨在提高系统的吞吐量和公平性,降低反馈开销。目标是在大规模网络环境中实现高效、公平的资源分配。 其他说明:文中提供了详细的代码实现步骤和仿真结果,有助于读者深入理解算法原理并进行实验验证。

    2025大模型训练性能瓶颈定位流程案例.pdf

    2025大模型训练性能瓶颈定位流程案例

    蓝桥杯Python竞赛真题详解:涵盖基础与进阶算法挑战

    内容概要:本文档提供了20道蓝桥杯Python竞赛真题及其详细解答,涉及质因数分解、分数计算、特别数求和、数字三角形、约数个数、草的生长模拟、工作时长计算、互质数统计、阶乘和判定、公因数匹配、直线计算、分糖果、矩阵填充、旅行计划优化、阶乘末尾零计数、最长递增子序列、最长公共子序列、最长回文子串、最长公共前缀和最长公共后缀等多个经典算法问题。每个题目都附有完整的代码实现和解释,帮助参赛者深入理解和掌握相关知识点。 适合人群:准备参加蓝桥杯或其他编程竞赛的学生和程序员,尤其是对Python编程有一定基础并希望提高算法能力的人群。 使用场景及目标:①作为赛前复习资料,巩固基础知识;②通过实际编程练习提升算法思维和解决问题的能力;③熟悉竞赛常见题型,增强应对复杂问题的信心。 其他说明:文档不仅提供了解答思路,还包含了具体的代码实现,有助于读者更好地理解和应用所学知识。同时,这些问题覆盖了多种数据结构和算法思想,能够全面锻炼编程技能。

    word-【软考-网络工程师】学习资源

    网络工程师(中级)是软考(计算机技术与软件专业技术资格考试)的一部分,主要考察计算机网络基础、网络安全、网络管理、操作系统、数据库等内容,考试分为上午的基础知识选择题和下午的案例分析题。

    《基于YOLOv8的宠物用品识别系统》(包含源码、完整数据集、可视化界面、部署教程)简单部署即可运行。功能完善、操作简单,适合毕设或课程设计.zip

    资源内项目源码是来自个人的毕业设计,代码都测试ok,包含源码、数据集、可视化页面和部署说明,可产生核心指标曲线图、混淆矩阵、F1分数曲线、精确率-召回率曲线、验证集预测结果、标签分布图。都是运行成功后才上传资源,毕设答辩评审绝对信服的保底85分以上,放心下载使用,拿来就能用。包含源码、数据集、可视化页面和部署说明一站式服务,拿来就能用的绝对好资源!!! 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、大作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.txt文件,仅供学习参考, 切勿用于商业用途。

Global site tag (gtag.js) - Google Analytics