Tinify API批处理压缩PNG和JPG(Java版本)

原创 2017年06月06日 21:29:56

因为工作的需要,所以用Tinify的Java API写了一个批处理小程序,主要是用来自动压缩UI和美术工具生成的新图片。在这里就分享出来,如果只是单纯的开发,其实真的是很简单,官方给的教程就很清晰了。稍微麻烦点的是搭建java的运行环境什么的以及下载相关的依赖包,可能会遇到一些问题。
这里只简单的说一下过程就贴代码了。

想先了解的,可以先看我之前翻译的官方 api文档:Tinify Java API中文参考文档

我是采用源码直接编译的,直接在Github上把Tinify Java的源代码给下载下来
https://github.com/tinify/tinify-java

IDE使用的是IntelliJ IDEA

一、工具用途需求

编写工具的主要目的有两个
1. 美术资源打包压缩处理,角色和ui图片资源的打包,这个是要嵌入到现在有的打包工具里面去。也就是说会被其他程序来调用。需要接受额外的参数。
2. 批处理来压缩某一个文件夹工具,直接运行jar就可以了。

二、设计思路

根据前面提到的两个使用需求,根据这些需求就可以整理出几个设计点了。
1. 由于每次压缩的图片数量不一致,所以必须支持指定文件夹和遍历文件夹里面的图片来压缩
2. 由于需要被其他程序调用,所以支持传参数过来
3. 支持单独运行,直接读取配置好的相关路径
4. 由于免费的key有500的限制,所以配置的key支持多个,以及自动检测是否失效,自动使用新的key

三、Java相关代码

这里我简单地使用一个Java类来解决。直接贴代码,有详细的注释。有可能会遇到没有下载到相关的jar包的问题,可以自己在pom.xml找到自己相应的jar版本,然后去下载。
这份代码实现了设计思路的前3点,最后多key的还没有实现。如果有人感兴趣的话在后面留言,我到时会把自己完善的代码再发出来。

配置文件:config.properties

key=你申请的key
input=E:/tinify/input
output=E:/tinify/output

TinifyClient.java类源码

import com.tinify.Source;
import com.tinify.Tinify;

import java.io.*;
import java.util.Iterator;
import java.util.Properties;
import java.util.Scanner;

/**
 * Created by sodaChen on 2017/5/21.
 */
public class TinifyClient
{
    /** 单个key的最大压缩图片数量 **/
    private static final int MAX_IMG = 500;
    /** 属性配置 **/
    private static Properties properties = new Properties();
    /** key的索引值 **/
    private static int keyIndex;
    /** 图片数量 **/
    private static int imgCount;
    public static void main(String[] args) throws Exception
    {
        System.out.println(System.getProperty("user.dir"));
        if(args.length == 0)
        {
            System.out.println("根据配置来压缩图片");
            //读取配置
            readConfigHanle();
        }
        else
        {
            System.out.println("根据输入参数来压缩图片");
            properties.setProperty("key",args[0]);
            properties.setProperty("input",args[1]);
            if(args.length == 3)
                properties.setProperty("output",args[2]);
            else
                properties.setProperty("output",args[1]);
        }
        //转换换用户自定义的字符串
        String str = properties.getProperty("input");
        str = str.replaceAll("/","\\\\");
        properties.setProperty("input",str);
        str = properties.getProperty("output");
        str = str.replaceAll("/","\\\\");
        properties.setProperty("output",str);
        //设置用户key
        Tinify.setKey(properties.getProperty("key"));
        File root = new File(properties.getProperty("input"));
        File[] files = root.listFiles();
        //遍历输入文件夹
        readDirectory(files);
        System.out.println("全部png和jpg压缩完成");
    }

    /**
     * 读取配置文件来设置属性
     */
    private static void readConfigHanle()
    {
        String confPath = "config.properties";
        try
        {
            InputStream in = new BufferedInputStream(new FileInputStream(confPath));
            //加载属性列表
            properties.load(in);
            in.close();
        } catch (Exception e)
        {
            System.out.println("读取配置文件错误");
            e.printStackTrace();
        }
    }

    /**
     * 读取文件夹,并处理里面的png和jpg图片
     * @param files
     */
    private static void readDirectory(File[] files)
    {
        for (File file : files)
        {
            String fileName = file.getName();
            if (file.isDirectory())
            {
                //递归读文件夹
                readDirectory(file.listFiles());
            }
            else
            {
                int index = fileName.lastIndexOf(".");
                String prefix = fileName.substring(index + 1);
                if (prefix.equals("png") || prefix.equals("jpg"))
                    //进行压缩
                    tinifyImg(file.getPath(), properties.getProperty("output"));
            }
        }
    }

    /**
     * 连接tinify的API进行压缩图片和保存回本地
     * @param inPath 文件路径
     * @param outPath 输出路径头
     */
    private static void tinifyImg(String inPath, String outPath)
    {
        try
        {
            System.out.println("上传:" + inPath);
            Source source = Tinify.fromFile(inPath);
            //确保输入和输出是一样的斜杠符号
            inPath = inPath.replaceAll("/","\\\\");
            //替换路径保存
            String savePath = inPath.replace(properties.getProperty("input"),outPath);
            System.out.println("保存:" + savePath);
            File file = new File(savePath);
            //如果没有文件夹,则根据路径生成文件夹
            if(!file.getParentFile().exists())
                file.getParentFile().mkdirs();
            source.toFile(savePath);
            System.out.println("完成!!!");
        }
        catch (Exception e)
        {
            e.printStackTrace();
            System.out.print("上传压缩失败!");
        }
    }
}

测试输出结果:

E:\workspaces\JavaProjects\tinifyJava
根据配置来压缩图片
上传:E:\tinify\input\mail\bg\bg.png
保存:E:\tinify\output\mail\bg\bg.png
完成!!!
上传:E:\tinify\input\mail\mail.png
保存:E:\tinify\output\mail\mail.png
Disconnected from the target VM, address: '127.0.0.1:2099', transport: 'socket'
完成!!!
全部png和jpg压缩完成

四、jar和bat

最后用IntelliJ IDEA生成tinify.jar,再写个bat小脚本,就可以运行使用啦(必须安装java的运行环境)

运行方式:
java -jar tinify.jar

设置key和路径有两种方式
1. 通过设置config.properties里面的属性


2. 通过执行jar的时候传奇参数(有参数则程序不会再读取config.properties了)
java -jar tinify.jar key input output
版权声明:本文为博主原创文章,转载必须声明出处和作者。地址:http://blog.csdn.net/sujun10 作者:弃天笑

[Python模块学习]用tinify模块压缩和优化图片

tinify模块使用帮助
  • jy692405180
  • jy692405180
  • 2016年09月02日 02:15
  • 1239

Tinify Java API中文参考文档

自己刚用Tinify Java写了一个批处理压缩图片的程序,所以想着顺带把这个教程给翻译了。最后发现翻译还是挺花时间的。自己写程序的时候,只是简单看看就明白,用api就可以直接写程序了。而且现在翻译软...
  • sujun10
  • sujun10
  • 2017年05月23日 14:43
  • 1279

图片压缩 java 压缩 JPG JPEG PNG GIF

package com.sun.util.cyw; import java.awt.Image; import java.awt.image.BufferedImage; import java...
  • sunjin9418
  • sunjin9418
  • 2012年04月10日 16:16
  • 4684

java读取粘贴板内容——将图片转成png或者jpg格式

package com; import java.awt.Graphics2D; import java.awt.Image; import java.awt.Toolkit; impor...
  • myfmyfmyfmyf
  • myfmyfmyfmyf
  • 2013年12月03日 14:25
  • 4040

java处理excel中图片(png,jpeg,jpg)

处理excel中图片的流程:(1). 将上传的excel保存到临时文件中 (2).将excel中的图片保存在服务器中,excel中原先是图片的地方,将以img标签《img src=’filePat...
  • forever_ss
  • forever_ss
  • 2016年06月02日 15:35
  • 229

java 将jpg、bmp、png、gif图片文件,进行等比或非等比的大小转换

import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.File...
  • graceup
  • graceup
  • 2014年10月23日 15:30
  • 560

JAVA读取EMF文件并转化为PNG,JPG,GIF格式

JAVA读取EMF文件并转化为PNG,JPG,GIF格式 使用第三方库下载地址为:http://java.freehep.org/vectorgraphics/index.html 主要思路: ...
  • jia20003
  • jia20003
  • 2012年11月22日 15:19
  • 7646

java将图片缩放实现类(能将jpg、bmp、png、gif图片文件,进行等比或非等比的大小转换)

/** * 缩略图实现,将图片(jpg、bmp、png、gif等等)真实的变成想要的大小 */ package com.joewalker.test; impo...
  • alongshow
  • alongshow
  • 2012年04月13日 16:33
  • 2013

Bitmap,jpg,png区别以及在Android上实现不载入内存压缩图片

图片有两种使用的场景:一种是在硬盘上的存储格式,一个是在内存的展开格式。 一、在内存中的图片          因为需要知道图片的所有信息,所有在内存中,图片一般是展开的。那以带透明的...
  • zaizai2154365
  • zaizai2154365
  • 2017年04月25日 16:25
  • 586

springboot搭建文件预览解决方案,支持目前主流格式office文件,txt文件,png,jpg等图片以及压缩文件的在线预览功能

前言 这些天在做一个文件预览的功能,由于之前没有这方面的经验,因此在市面上找了一些这方面的资料,发现目前市面上主流的文件预览服务是由几家厂商提供的,做的比较好的有如永中软件,officeweb36...
  • ccc1234_
  • ccc1234_
  • 2018年01月13日 17:56
  • 53
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Tinify API批处理压缩PNG和JPG(Java版本)
举报原因:
原因补充:

(最多只允许输入30个字)