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水印叠加,位置调整等。

地址:

      使用方法:

1、图片格式转换

     SimpleImageTool.of("c:/img/1.psd")
                    .toFile(new File("c:/img/test/t2.gif")); //gif png tiff jpg等多种格式

java 加载动图_Image

2、网络图片流

java 加载动图_java_02

设置定宽高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"));

效果如图:

java 加载动图_缩放_03

定宽600:高自动

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

定高600: 宽自动

java 加载动图_java 加载动图_04

转换黑白图片:

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"));

效果如图:

java 加载动图_java 加载动图_05

旋转时可以填充背景颜色,默认是透明的

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"));

java 加载动图_ci_06

裁切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,然后)从中间裁切,丢弃一部分

java 加载动图_缩放_07

图片水印:

 

  

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"));

java 加载动图_java_08

java 加载动图_java 加载动图_09

文字水印

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

java 加载动图_java_10

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);

java 加载动图_java 加载动图_11

同时多个水印

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"));

java 加载动图_Image_12

 

位置可以通过postion预置位置,或者通过point(x,y)来设置 比如point(200,200)

很多组合等待你的实验,我觉得需要用到的基本上满足。 

      图片质量可以通过quality来设置 0<quality=<1

    .writeParam(new WriteParameter().dpi(200).quality(0.9F))

 

原图

java 加载动图_Image_13

缩放200*200

java 加载动图_Image_14

打两个文字水印

java 加载动图_缩放_15

透明背景

java 加载动图_java_16

缩小到100*100

java 加载动图_ci_17

后记:

       国内很多文章都是乱抄,很多代码根本不能实现功能,我再怀疑测试过没有,设置dpi相关的代码国内还没看到一个能设置有效的。获取文字基准线baseline也是找遍资料也找到确切的信息,最终通过猜来实现比较靠谱的方法。由于本人水平有限,根据自己的业务需要实现的,甩出来能方便到大家就为最好。

        知识点回顾:

    1、图片转换变红或变黄 分析测试发现是由于有了透明通道的原

    2、png转换gif丢失部分图像细节,由于图片中包含半透明像素。必须做特殊处理才能显示出来

java 加载动图_java_18

PNG 原图

ImageIO和simpleimag 获得图片

java 加载动图_Image_19

simpleImageTool

java 加载动图_缩放_20

        图像质量要好于原生和阿里巴巴的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处理。

待续。。。。。。