simpleImageTool又纯java图片水印、缩放工具
simpleImageTool又一个简单、好用的图片格式转换、缩放水印叠加等功能的纯Java图片工具库。
simpleImageTool的由来,近期需要用到图片处理,通过网上的图片流直接进行缩放水印叠加等,需要一个纯java的处理库,在网上找一下没有符合我的库,要么是太老很多还是jdk1.6以前的,要么是功能不够好。找到阿里的simpleimage功能还算完善,1.7环境下想使用很麻烦,还要搞JAI的包,在改simpleimage(JPG图片处理相关的用新的ImageIO方式处理已经改好)时发现我不需要那么多功能而且有的功能还不完善,改好估计比造个小轮子还麻烦,所以就造了一个小轮子,抄了些simpleimage的代码。解决了目前常见的库的一些问题,如图片变红,转换成gif只有丢失部分图像
特点:1、使用超级简单,链方式,图片缩放,旋转、水印一次性搞定,水印也支持旋转这类的操作然后再叠加
2、支持格式目前算比较全面的
3、gif支持算开源中算好的,完善待续(gif4J算很不错的,就是闭源收费)。
4、支持读取的格式:jpeg、tif、icns、WBMP、targa、ico、TARGA、psd、JPG、wbmp、PNG、JPEG、tga、tiff、CUR、BMP、SGI、GIF、TIF、TIFF、bmp、jpg、TGA、PSD、png、ICNS、ICO、cur、gif、sgi
5、支持写入式:BMP、tif、jpeg、WBMP、GIF、TIF、TIFF、jpg、bmp、JPG、wbmp、png、PNG、JPEG、gif、tiff
6、支持gif水印叠加,位置调整等。
地址:https://git.oschina.net/clive_hua/simpleImageTool
使用方法:
1、图片格式转换
SimpleImageTool.of("c:/img/1.psd")
.toFile(new File("c:/img/test/t2.gif")); //gif png tiff jpg等多种格式

2、网络图片流

设置定宽高600*600,默认锁定比例 不够的部分补白
SimpleImageTool.of(is)
.size(600, 600)
.toFile(new File("c:/img/test/600x600.jpg"));
SimpleImageTool.of(is)
.size(600, 600)
.bgColor(Color.blue)
.toFile(new File("c:/img/test/旋转20度.jpg"));
SimpleImageTool.of(is)
.size(600, 600)
.rotate(20)
.toFile(new File("c:/img/test/旋转20度.jpg"));
效果如图:

定宽600:高自动
SimpleImageTool.of(is)
.width(600)
.toFile(new File("c:/img/test/w600.jpg"));
定高600: 宽自动

转换黑白图片:
SimpleImageTool.of(is)
.height(600)
.gray(true)
.toFile(new File("c:/img/test/gray.jpg"));
旋转20度并黑白:
SimpleImageTool.of(is)
.height(600)
.rotate(20)
.gray(true)
.toFile(new File("c:/img/test/rotate+gray.jpg"));
旋转20度
SimpleImageTool.of(is)
.height(600)
.rotate(20)
//.gray(true)
.toFile(new File("c:/img/test/rotate20.jpg"));
效果如图:

旋转时可以填充背景颜色,默认是透明的
SimpleImageTool.of(is)
.height(600)
.rotate(20)
.bgColor(Color.blue)
.toFile(new File("c:/img/test/rotate20Blue.jpg"));
指定宽高不锁定图片比例拉伸变形
SimpleImageTool.of(is)
.size(600,600)
.lockScale(false)
.toFile(new File("c:/img/test/unlockScale.jpg"));
指定缩放倍数0.5
SimpleImageTool.of(is)
.size(600,600)
.scale(0.5)
.toFile(new File("c:/img/test/scale0.5.jpg"));

裁切200*300 可以看出是先调整到合适的尺寸从中间裁切
SimpleImageTool.of(is)
.cut(200,300)
.toFile(new File("c:/img/test/cut200x300.jpg"));
SimpleImageTool.of(is)
.cut(200,300)
.rotate(20)
.toFile(new File("c:/img/test/cutRotate.jpg"));
可以看出是先调整到合适的尺寸(先调整到高300,宽远超出200,然后)从中间裁切,丢弃一部分

图片水印:
BufferedImage watermarkImage = ImageIO.read(new FileInputStream("c:/img/tojpeg.png"));
WatermarkParameter watermark = new WatermarkParameter().addWaterMarkImage(watermarkImage)
.postion(Positions.CENTER)
//.rotate(20f)
.color(Color.blue)
.opacity(0.2f);
//网络获取图片进行相应的图片处理 水印 缩放 或者剪切,旋转
String src = "https://hd.mi.com/x/07121b/img/gl-img-3.jpg?v=24b1fad";
URL url = new URL(src);
URLConnection uri = url.openConnection();
//获取数据流
InputStream is = uri.getInputStream();
try {
SimpleImageTool.of(is)
.size(600,600)
.watermark(watermark)
//.watermark(watermark2)
.toFile(new File("c:/img/test/图片水印.jpg"));


文字水印
WatermarkParameter watermark2 = new WatermarkParameter().addWaterText("测试水印")
.postion(Positions.CENTER)
.rotate(20f)
.font(new Font("隶书",Font.BOLD,50))
.color(Color.blue)
.opacity(0.2f);

WatermarkParameter watermark2 = new WatermarkParameter().addWaterText("测试水印")
//.postion(Positions.CENTER)
.point(200,200)
//.rotate(20f)
.font(new Font("隶书",Font.BOLD,50))
.color(Color.blue)
.opacity(0.2f);

同时多个水印
BufferedImage watermarkImage = ImageIO.read(new FileInputStream("c:/img/tojpeg.png"));
WatermarkParameter watermark = new WatermarkParameter().addWaterMarkImage(watermarkImage)
.postion(Positions.CENTER)
.rotate(20f)
.color(Color.blue)
.opacity(0.6f);
WatermarkParameter watermark2 = new WatermarkParameter().addWaterText("测试水印")
// .postion(Positions.BOTTOM_LEFT)
.point(20,500)
//.rotate(20f)
.color(Color.blue)
.opacity(0.2f);
//网络获取图片进行相应的图片处理 水印 缩放 或者剪切,旋转
String src = "https://hd.mi.com/x/07121b/img/gl-img-3.jpg?v=24b1fad";
URL url = new URL(src);
URLConnection uri = url.openConnection();
//获取数据流
InputStream is = uri.getInputStream();
try {
SimpleImageTool.of(is)
.size(600,600)
.watermark(watermark)
.watermark(watermark2)
.toFile(new File("c:/img/test/waterMark.jpg"));

位置可以通过postion预置位置,或者通过point(x,y)来设置 比如point(200,200)
很多组合等待你的实验,我觉得需要用到的基本上满足。
图片质量可以通过quality来设置 0<quality=<1
.writeParam(new WriteParameter().dpi(200).quality(0.9F))
gif 缩放有透明背景
原图

压缩成200*200(保持透明背景)

原图

缩放200*200

打两个文字水印

透明背景

缩小到100*100

后记:
国内很多文章都是乱抄,很多代码根本不能实现功能,我再怀疑测试过没有,设置dpi相关的代码国内还没看到一个能设置有效的。获取文字基准线baseline也是找遍资料也找到确切的信息,最终通过猜来实现比较靠谱的方法。由于本人水平有限,根据自己的业务需要实现的,甩出来能方便到大家就为最好。
知识点回顾:
1、图片转换变红或变黄 分析测试发现是由于有了透明通道的原
2、png转换gif丢失部分图像细节,由于图片中包含半透明像素。必须做特殊处理才能显示出来

PNG 原图
ImageIO和simpleimag 获得图片

simpleImageTool

图像质量要好于原生和阿里巴巴的simpleImage处理图片
有的gif透明背景存在小问题,大部分能处理的比较好,通过我所找的资料来看,gif背景处理的好的是gif4j,这是收费软件,免费的来说应该是我这个做的算可以的了。免费的都是基于 AnimatedGifEncoder 来做的,没有第二个开源的java版gif编解码了,看了其源码压根就没处理透明通道信息,
if ((w != width) || (h != height) || (type != BufferedImage.TYPE_3BYTE_BGR)) {
// create new image with right size/format
BufferedImage temp = new BufferedImage(width, height, BufferedImage.TYPE_3BYTE_BGR);
初步看了gif4j专门处理了透明通道,目前也不要找免费Gif透明处理很好的了,我找了两天也就这结果,等有时间了认真研究gif4j的编解码。有那位兄弟研究出来通知我,改进gif处理。
待续。。。。。。
附件下载地址:http://download.csdn.net/my/uploads
simpleImageTool又纯java图片水印、缩放工具的更多相关文章
- Java图片高保真缩放工具类
Java图片高保真缩放 package com.xindai.auth.service.util; import java.awt.image.BufferedImage; import java.i ...
- java常用开发工具类之 图片水印,文字水印,缩放,补白工具类
import java.awt.AlphaComposite; import java.awt.Color; import java.awt.Font; import java.awt.Graphic ...
- java 图片压缩 剪切 水印 转换 黑白 缩放
专注java已6年,欢迎加入java核心技术QQ群:135138817,每周五晚有群主进行技术讲座. import java.awt.AlphaComposite; import java.awt.C ...
- JAVA实用案例之图片水印开发
写在最前面 上周零零碎碎花了一周的时间研究水印的开发,现在终于写了个入门级的Demo,做下笔记同时分享出来供大家参考. Demo是在我上次写的 JAVA实用案例之文件导入导出(POI方式) 框架基础上 ...
- Java图片加文字水印
Java图片加文字水印 import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.I ...
- Java 在PDF中添加水印——文本/图片水印
水印是一种十分常用的防伪手段,常用于各种文档.资料等.常见的水印,包括文字类型的水印.图片或logo类型的水印.以下Java示例,将分别使用insertTextWatermark(PdfPageBas ...
- Java给图片和PDF文件添加水印(图片水印和文字水印)
有时候我们看到的图片或者PDF文件会自动加上水印.分为文字水印和图片水印. ----------------------------图片水印---------------------------- 1 ...
- java -PDF添加文本水印与图片水印
java pdf添加水印文本及图片文本 PDF文件添加文本水印: private static int interval = 30; public static void waterMark(Stri ...
- Java 添加Word文本水印、图片水印
水印是一种常用于各种文档的声明.防伪手段,一般可设置文字水印或者加载图片作为水印.以下内容将分享通过Java编程给Word文档添加水印效果的方法,即 文本水印 图片水印 使用工具:Free Spire ...
随机推荐
- 一天搞定CSS:边框border--02
每一个标签都是一个盒子,具体见HTML教程 因此,每一个标签有大小,有边框 1.border样式:单一样式 2.border样式:复合样式 border: 粗细 类型 颜色: 3.border方向 4 ...
- iOS地理围栏技术的应用
遇到一个需求,要求监测若干区域,设备进入这些区域则要上传数据,且可以后台监测,甚至app被杀死也要监测.发现oc的地理围栏技术完美匹配这个需求,任务做完了,把遇到的坑记录下来,也许能帮到你呢. 要做这 ...
- go服务端----使用dotweb框架搭建简易服务
使用dotweb框架搭建简易服务 go语言web框架挺多的,所谓琳琅满目,里面也有很多优秀的,比如echo.beego等,但体验下来,总是觉得哪里有点小疙瘩,后来才明白过来,echo太简单,很多日常使 ...
- 基于范围的for循环(STL)
1. ]={4.99,5.99,6.99,7.99,8.99}; for (double x : prices) cout<<x<<endl; //////////////// ...
- JavaScript概念总结:作用域、闭包、对象与原型链
1 JavaScript变量作用域 1.1 函数作用域 没有块作用域:即作用域不是以{}包围的,其作用域完成由函数来决定,因而if /for等语句中的花括号不是独立的作用域. 如前述,JS的在函数中定 ...
- java计算某个日期是什么节气(24节气)
package com.test; import java.util.Calendar; import java.util.Date; /** * Created by json */ public ...
- JavaScript之语句,循环
JavaScript中语句主要分为三类:顺序,分支,循环. 1.顺序语句: 按照循序依次执行,最普通常见的语句,这里不多赘述. 其结构如下 2.分支语句: 根据条件判断,不同的结果执行不同的语句. 其 ...
- APP热更新方案
为什么要做热更新 当一个App发布之后,突然发现了一个严重bug需要进行紧急修复,这时候公司各方就会忙得焦头烂额:重新打包App.测试.向各个应用市场和渠道换包.提示用户升级.用户下载.覆盖安装. 重 ...
- 聊聊RocksDB Compact
| 导语 对于 LevelCompact 策略,RocksDB会根据每一层不同的策略计算出CompactScore,根据CompactScore大小来决定那一层将会优先进行Compact,然后选择Le ...
- tcp/ip详解 卷1 -- 协议概述
第一章 概述 分层 TCP/IP 通常被认为是一个四层协议系统. 每一层负责不同的功能. 链路层, 也成为数据链路层或者网络接口层. 通常包括 操作系统中的设备驱动程序和计算机中对应的网络接口卡. 主 ...