Java操作Google Webp图片格式转换实践

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/boonya/article/details/88849641

Java使用webp代码编译

  1. webp-imageio
    开源库 下载压缩包到本地进行编译jar,工程用gradle来维护。

  2. libwebp
    google-developer下载压缩包到本地编译动态链接库-不同平台的动态链接库编译出来是不同的。mac下是.dylib, windowns下是.dll, unix/linux下是.so. 我在mac和linux下编译过,记录下linux下编译过程。

  3. compiling

libwebp-0.6.1.tar.gz luciad-webp-imageio-8f9b44b41902.zip

tar -xzvf libwebp-0.6.1.tar.gz
unzip luciad-webp-imageio-8f9b44b41902.zip
mv libwebp-0.6.1 ./luciad-webp-imageio-8f9b44b41902/libwebp

cd luciad-webp-imageio-8f9b44b41902
cmake .
cmake --build .

cmake如果装的话,请自行下载安装官网 安装用法

./gradlew build -x test
  1. java project
    将libwebp-imageio.so放入工程的当前目录,因为默认的java.library.path含工程当前路径。同时引入打好的luciad-webp-imageio-8f9b44b41902-0.6.0-SNAPSHOT.jar引入工程中。如果是maven工程的话,可以把jar先推到远程的仓库里。
  • java transfer
image = ImageIO.read(new URL(imageUrl));
// Encode it as webp using default settings
boolean result = ImageIO.write(image, "webp", bos);
  • gradle push to repositry
    update build.gradle
apply plugin: "maven-publish" //插件required
group = "com.luciad.imageio.webp"

publishing {
    publications {
        mavenJava(MavenPublication) {
           from components.java
        }
    }
    repositories {
        maven {
             url "http://***"
             credentials {
                      username = ****
                      password = ****
            }
      }
   }
}

publish

gradle publishMavenPublicationToMavenRepository

有时间的话可以自己编译,此处来自:https://www.jianshu.com/p/5827f9063fe9

Webp开源项目

nintha/webp-imageio-core

qwong/j-webp

下载此开源项目没有跑起来,dll包有问题。直接使用0.4.2可以正常使用,下载地址如下:

Webp 编解码

编码

package example;

import com.luciad.imageio.webp.WebPWriteParam;

import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriter;
import javax.imageio.stream.FileImageOutputStream;

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class EncodeTest {
    public static void main(String args[]) throws IOException {
        String inputPngPath = "test_pic/test.png";
        String inputJpgPath = "test_pic/test.jpg";
        String outputWebpPath = "test_pic/test_.webp";

        // Obtain an image to encode from somewhere
        BufferedImage image = ImageIO.read(new File(inputJpgPath));

        // Obtain a WebP ImageWriter instance
        ImageWriter writer = ImageIO.getImageWritersByMIMEType("image/webp").next();

        // Configure encoding parameters
        WebPWriteParam writeParam = new WebPWriteParam(writer.getLocale());
        writeParam.setCompressionMode(WebPWriteParam.MODE_DEFAULT);

        // Configure the output on the ImageWriter
        writer.setOutput(new FileImageOutputStream(new File(outputWebpPath)));

        // Encode
        long st = System.currentTimeMillis();
        writer.write(null, new IIOImage(image, null, null), writeParam);
        System.out.println("cost: " + (System.currentTimeMillis() - st));
    }
}

解码

package example;

import com.luciad.imageio.webp.WebPReadParam;

import javax.imageio.ImageIO;
import javax.imageio.ImageReader;
import javax.imageio.stream.FileImageInputStream;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

public class DecodeTest {
    public static void main(String args[]) throws IOException {
    	System.load("C:\\Users\\admin\\Desktop\\webp\\webp-code\\webp-imageio-core\\src\\main\\resources\\META-INF\\lib\\windows_64\\webp-imageio.dll");
        String inputWebpPath = "test_pic/test.webp";
        String outputJpgPath = "test_pic/test_.jpg";
        String outputJpegPath = "test_pic/test_.jpeg";
        String outputPngPath = "test_pic/test_.png";

        // Obtain a WebP ImageReader instance
        ImageReader reader = ImageIO.getImageReadersByMIMEType("image/webp").next();

        // Configure decoding parameters
        WebPReadParam readParam = new WebPReadParam();
        readParam.setBypassFiltering(true);

        // Configure the input on the ImageReader
        reader.setInput(new FileImageInputStream(new File(inputWebpPath)));

        // Decode the image
        BufferedImage image = reader.read(0, readParam);

        ImageIO.write(image, "png", new File(outputPngPath));
        ImageIO.write(image, "jpg", new File(outputJpgPath));
        ImageIO.write(image, "jpeg", new File(outputJpegPath));

    }
}

更多阅读:https://segmentfault.com/a/1190000016324137

猜你喜欢

转载自blog.csdn.net/boonya/article/details/88849641