You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
190 lines
6.9 KiB
190 lines
6.9 KiB
package org.pqh.gif;
|
|
|
|
import com.fasterxml.jackson.databind.JsonNode;
|
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
|
import org.apache.commons.io.FileUtils;
|
|
import org.jsoup.Connection;
|
|
import org.jsoup.Jsoup;
|
|
import org.jsoup.nodes.Document;
|
|
import org.pqh.core.util.LogManger;
|
|
import org.pqh.gif.gifmaker.AnimatedGifEncoder;
|
|
|
|
import javax.imageio.ImageIO;
|
|
import java.awt.*;
|
|
import java.awt.image.BufferedImage;
|
|
import java.io.*;
|
|
import java.util.Enumeration;
|
|
import java.util.List;
|
|
import java.util.zip.ZipEntry;
|
|
import java.util.zip.ZipFile;
|
|
|
|
import static org.pqh.gif.PixivUtil.Image.big;
|
|
import static org.pqh.gif.PixivUtil.Image.small;
|
|
|
|
/**
|
|
* Created by reborn on 2017/9/24.
|
|
*/
|
|
public class PixivUtil implements LogManger{
|
|
private static final String host="http://i4.pixiv.net";
|
|
private static final int buffer=10240;
|
|
|
|
public static void downLoadImg(String imageUrl){
|
|
|
|
InputStream is = null;
|
|
FileOutputStream fos = null;
|
|
BufferedOutputStream bos = null;
|
|
ZipFile zipFile = null;
|
|
try {
|
|
log.info("图片链接:"+imageUrl);
|
|
Document document=Jsoup.connect(imageUrl).header("Cookie","PHPSESSID=11866657_32c3f92f0e2bf8b1607dabc04eecf787;").get();
|
|
String script=document.select("#wrapper>script").html();
|
|
int start=script.indexOf(small.keyword);
|
|
int end=script.indexOf(big.keyword);
|
|
if(start>-1&&end>-1) {
|
|
String json = script.substring(start, end).replaceAll(".*=", "");
|
|
ObjectMapper objectMapper = new ObjectMapper();
|
|
JsonNode node = objectMapper.readTree(json);
|
|
String src=node.get("src").asText().replace(small.size,big.size);
|
|
log.info("获取到图包地址:"+src);
|
|
Connection connection= Jsoup.connect(src).header("referer",host).ignoreContentType(true);
|
|
connection.request().maxBodySize(1024*1024*1024);
|
|
Connection.Response response=connection.execute();
|
|
log.info("图包体积:"+response.header("content-length"));
|
|
String zipName=src.substring(src.lastIndexOf("/")+1);
|
|
File file=new File("tmp/images/"+zipName);
|
|
FileUtils.writeByteArrayToFile(file,response.bodyAsBytes());
|
|
log.info("图包下载到:"+file.getAbsolutePath());
|
|
zipFile=new ZipFile(file);
|
|
Enumeration entrys=zipFile.entries();
|
|
|
|
log.info("开始解压");
|
|
|
|
long a= System.currentTimeMillis();
|
|
String path=file.getAbsolutePath().replace(".zip","");
|
|
while(entrys.hasMoreElements()){
|
|
ZipEntry zipEntry= (ZipEntry) entrys.nextElement();
|
|
is= zipFile.getInputStream(zipEntry);
|
|
String imgPath=path+"\\"+zipEntry.getName();
|
|
File imgFile=new File(imgPath);
|
|
FileUtils.forceMkdirParent(imgFile);
|
|
log.info("开始解压图片到:"+imgFile.getAbsolutePath());
|
|
byte buf[]=new byte[buffer];
|
|
fos=new FileOutputStream(imgFile);
|
|
bos=new BufferedOutputStream(fos,buffer);
|
|
int count;
|
|
while((count=is.read(buf))>-1){
|
|
bos.write(buf,0,count);
|
|
}
|
|
|
|
}
|
|
|
|
int length=new File(path).listFiles().length;
|
|
log.info(length+"张图片解压完毕,耗时:"+(System.currentTimeMillis()-a)+"ms");
|
|
|
|
if(length>0){
|
|
jpgToGif(document.title().split("/")[0].replaceAll("[「,」]",""),path,node.get("frames"));
|
|
}
|
|
|
|
}else{
|
|
log.error("图包地址获取失败");
|
|
}
|
|
} catch (IOException e) {
|
|
e.printStackTrace();
|
|
}finally {
|
|
try {
|
|
if(bos != null){
|
|
bos.close();
|
|
}
|
|
if(fos != null) {
|
|
fos.close();
|
|
}
|
|
if(is != null){
|
|
is.close();
|
|
}
|
|
if(zipFile != null){
|
|
zipFile.close();
|
|
}
|
|
} catch (IOException e) {
|
|
log.error(e);
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
/**
|
|
* jpg合成gif
|
|
* @param gifName gif文件名
|
|
* @param jpgPath jpg文件目录
|
|
*/
|
|
public static void jpgToGif(String gifName,String jpgPath,JsonNode node){
|
|
AnimatedGifEncoder animatedGifEncoder=new AnimatedGifEncoder();
|
|
OutputStream outputStream= null;
|
|
InputStream inputStream=null;
|
|
File file=new File(jpgPath);
|
|
File gifFile=new File(jpgPath+"/"+gifName+".gif");
|
|
if(gifFile.exists()){
|
|
gifFile.delete();
|
|
}
|
|
log.info("动图将生成到"+gifFile.getAbsolutePath());
|
|
try {
|
|
outputStream = new FileOutputStream(gifFile);
|
|
animatedGifEncoder.start(outputStream);
|
|
//数组转集合
|
|
List<File> fileList= (List<File>) FileUtils.listFiles(file,new String[]{"jpg"},false);
|
|
long a=System.currentTimeMillis();
|
|
|
|
for(File f:fileList){
|
|
//获取当前帧延迟信息
|
|
int index=fileList.indexOf(f);
|
|
int delay=node.get(index).get("delay").asInt();
|
|
inputStream=new FileInputStream(f.getAbsoluteFile());
|
|
BufferedImage image = ImageIO.read(inputStream);
|
|
//把帧添加进去合成
|
|
animatedGifEncoder.addFrame(image);
|
|
animatedGifEncoder.setDelay(delay);
|
|
log.info(gifName+":正在合成第"+((index+1)+"帧"));
|
|
}
|
|
//添加完所有帧开始合成
|
|
animatedGifEncoder.finish();
|
|
long b=System.currentTimeMillis();
|
|
log.info("合成"+fileList.size()+"帧花费时间"+(b-a)+"ms");
|
|
} catch (FileNotFoundException e) {
|
|
e.printStackTrace();
|
|
} catch (IOException e) {
|
|
e.printStackTrace();
|
|
}finally {
|
|
try {
|
|
if(outputStream!=null){
|
|
outputStream.close();
|
|
}
|
|
if(inputStream!=null){
|
|
inputStream.close();
|
|
}
|
|
} catch (IOException e) {
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
if (gifFile.exists()) {
|
|
try {
|
|
Desktop.getDesktop().open(gifFile);
|
|
} catch (IOException e) {
|
|
e.printStackTrace();
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
enum Image{
|
|
small("pixiv.context.ugokuIllustData","600x600"),
|
|
big("pixiv.context.ugokuIllustFullscreenData","1920x1080");
|
|
|
|
private String keyword;
|
|
private String size;
|
|
|
|
Image(String keyword, String size) {
|
|
this.keyword = keyword;
|
|
this.size = size;
|
|
}
|
|
}
|
|
|
|
}
|
|
|