hellodk
2 years ago
4 changed files with 241 additions and 0 deletions
@ -0,0 +1,14 @@ |
|||||
|
# ---> Maven |
||||
|
target/ |
||||
|
pom.xml.tag |
||||
|
pom.xml.releaseBackup |
||||
|
pom.xml.versionsBackup |
||||
|
pom.xml.next |
||||
|
release.properties |
||||
|
dependency-reduced-pom.xml |
||||
|
buildNumber.properties |
||||
|
.mvn/timing.properties |
||||
|
# https://github.com/takari/maven-wrapper#usage-without-binary-jar |
||||
|
.mvn/wrapper/maven-wrapper.jar |
||||
|
|
||||
|
.idea |
@ -0,0 +1,9 @@ |
|||||
|
FROM openjdk:11.0.15-jre-bullseye |
||||
|
|
||||
|
MAINTAINER hellodk<[email protected]> |
||||
|
|
||||
|
WORKDIR /opt/app/ |
||||
|
|
||||
|
COPY target/tinyimage-1.0-SNAPSHOT-jar-with-dependencies.jar ./ |
||||
|
|
||||
|
RUN echo 'alias tiny="java -jar /opt/app/tinyimage-1.0-SNAPSHOT-jar-with-dependencies.jar"' >> ~/.bashrc |
@ -0,0 +1,64 @@ |
|||||
|
<?xml version="1.0" encoding="UTF-8"?> |
||||
|
<project xmlns="http://maven.apache.org/POM/4.0.0" |
||||
|
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" |
||||
|
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> |
||||
|
<modelVersion>4.0.0</modelVersion> |
||||
|
|
||||
|
<groupId>com.hellodk</groupId> |
||||
|
<artifactId>tinyimage</artifactId> |
||||
|
<version>1.0-SNAPSHOT</version> |
||||
|
|
||||
|
<properties> |
||||
|
<maven.compiler.source>11</maven.compiler.source> |
||||
|
<maven.compiler.target>11</maven.compiler.target> |
||||
|
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> |
||||
|
</properties> |
||||
|
|
||||
|
<dependencies> |
||||
|
<dependency> |
||||
|
<groupId>com.tinify</groupId> |
||||
|
<artifactId>tinify</artifactId> |
||||
|
<version>1.6.4</version> |
||||
|
</dependency> |
||||
|
<dependency> |
||||
|
<groupId>cn.hutool</groupId> |
||||
|
<artifactId>hutool-core</artifactId> |
||||
|
<version>5.7.19</version> |
||||
|
</dependency> |
||||
|
</dependencies> |
||||
|
|
||||
|
|
||||
|
<build> |
||||
|
<plugins> |
||||
|
<plugin> |
||||
|
<groupId>org.apache.maven.plugins</groupId> |
||||
|
<artifactId>maven-assembly-plugin</artifactId> |
||||
|
<version>3.2.0</version> |
||||
|
<configuration> |
||||
|
<archive> |
||||
|
<manifest> |
||||
|
<!-- 运行 jar 包时运行的主类,要求写全类名 需要包含 package name --> |
||||
|
<mainClass>MainService</mainClass> |
||||
|
<!-- 是否指定项目 classpath 下的依赖 --> |
||||
|
<addClasspath>true</addClasspath> |
||||
|
</manifest> |
||||
|
</archive> |
||||
|
<descriptorRefs> |
||||
|
<descriptorRef>jar-with-dependencies</descriptorRef> |
||||
|
</descriptorRefs> |
||||
|
</configuration> |
||||
|
<executions> |
||||
|
<execution> |
||||
|
<id>make-assembly</id> |
||||
|
<phase>package</phase> |
||||
|
<goals> |
||||
|
<goal>single</goal> |
||||
|
</goals> |
||||
|
</execution> |
||||
|
</executions> |
||||
|
</plugin> |
||||
|
</plugins> |
||||
|
</build> |
||||
|
|
||||
|
|
||||
|
</project> |
@ -0,0 +1,154 @@ |
|||||
|
import cn.hutool.core.img.ImgUtil; |
||||
|
import cn.hutool.core.io.IoUtil; |
||||
|
import cn.hutool.core.swing.clipboard.ImageSelection; |
||||
|
import com.tinify.Source; |
||||
|
import com.tinify.Tinify; |
||||
|
|
||||
|
import javax.imageio.ImageIO; |
||||
|
import java.awt.Graphics2D; |
||||
|
import java.awt.Image; |
||||
|
import java.awt.Toolkit; |
||||
|
import java.awt.datatransfer.Clipboard; |
||||
|
import java.awt.datatransfer.DataFlavor; |
||||
|
import java.awt.datatransfer.StringSelection; |
||||
|
import java.awt.datatransfer.Transferable; |
||||
|
import java.awt.datatransfer.UnsupportedFlavorException; |
||||
|
import java.awt.image.BufferedImage; |
||||
|
import java.io.ByteArrayInputStream; |
||||
|
import java.io.File; |
||||
|
import java.io.FileInputStream; |
||||
|
import java.io.IOException; |
||||
|
import java.nio.file.Files; |
||||
|
import java.nio.file.Paths; |
||||
|
import java.time.Duration; |
||||
|
import java.time.Instant; |
||||
|
import java.time.LocalDateTime; |
||||
|
import java.time.ZoneId; |
||||
|
import java.time.format.DateTimeFormatter; |
||||
|
|
||||
|
/** |
||||
|
* @author: hellodk |
||||
|
* @description main service |
||||
|
* @date: 2022/7/19 11:10 |
||||
|
*/ |
||||
|
|
||||
|
public class MainService { |
||||
|
|
||||
|
private static final String tmp_folder = "./tmp/"; |
||||
|
|
||||
|
public static void main(String[] args) { |
||||
|
Instant start = Instant.now(); |
||||
|
MainService main = new MainService(); |
||||
|
main.getSysClipboard(); |
||||
|
Instant end = Instant.now(); |
||||
|
Duration between = Duration.between(start, end); |
||||
|
System.out.println("Time elapsed: " + between.getSeconds() + "s."); |
||||
|
System.exit(0); |
||||
|
} |
||||
|
|
||||
|
private void setSysClipboard(Object obj) { |
||||
|
Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard(); |
||||
|
if (obj instanceof String) { |
||||
|
StringSelection stringSelection = new StringSelection((String) obj); |
||||
|
clipboard.setContents(stringSelection, null); |
||||
|
} |
||||
|
else if (obj instanceof Image) { |
||||
|
ImageSelection imageSelection = new ImageSelection((Image) obj); |
||||
|
clipboard.setContents(imageSelection, null); |
||||
|
} |
||||
|
else { |
||||
|
System.out.println("Clipboard content wrong."); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
private void getSysClipboard() { |
||||
|
Clipboard clip = Toolkit.getDefaultToolkit().getSystemClipboard(); |
||||
|
Transferable tr = clip.getContents(null); |
||||
|
if (tr != null) { |
||||
|
if (tr.isDataFlavorSupported(DataFlavor.imageFlavor)) { |
||||
|
try { |
||||
|
Image image = (Image) tr.getTransferData(DataFlavor.imageFlavor); |
||||
|
// Create a buffered image with transparency
|
||||
|
BufferedImage bImage = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_ARGB); |
||||
|
|
||||
|
// Draw the image on to the buffered image
|
||||
|
Graphics2D bGr = bImage.createGraphics(); |
||||
|
bGr.drawImage(image, 0, 0, null); |
||||
|
bGr.dispose(); |
||||
|
File folder = new File(tmp_folder); |
||||
|
folder.mkdir(); |
||||
|
String filePath = tmp_folder.concat(getNowTimeStr()).concat(".png"); |
||||
|
File output = new File(filePath); |
||||
|
ImgUtil.write(bImage, output); |
||||
|
System.out.println("Original image file name is " + output.getName() + ". File size is " + getFileSize(filePath)); |
||||
|
// 调用 tinypng api 去压缩图片并下载下来
|
||||
|
tinyPng(output); |
||||
|
} |
||||
|
catch (UnsupportedFlavorException | IOException e) { |
||||
|
System.out.println(e); |
||||
|
} |
||||
|
} |
||||
|
else { |
||||
|
System.out.println("Only deal with image, please put an image to your system clipboard."); |
||||
|
} |
||||
|
} |
||||
|
else { |
||||
|
System.out.println("System clipboard is null!"); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
private String getFileSize(String filePath) { |
||||
|
double size = 0; |
||||
|
try { |
||||
|
size = Files.size(Paths.get(filePath)); |
||||
|
} |
||||
|
catch (IOException e) { |
||||
|
System.out.println("file not found: " + e); |
||||
|
} |
||||
|
String fileSize; |
||||
|
if (size >= (1024 * 1024)) { |
||||
|
fileSize = String.format("%,.2f MB.", size / 1024 / 1024); |
||||
|
} |
||||
|
else if (size >= 1024) { |
||||
|
fileSize = String.format("%,.2f KB.", size / 1024); |
||||
|
} |
||||
|
else { |
||||
|
fileSize = String.format("%,.2f Bytes.", size); |
||||
|
} |
||||
|
return fileSize; |
||||
|
} |
||||
|
|
||||
|
private void tinyPng(File output) { |
||||
|
try { |
||||
|
Tinify.setKey("replace_with_your_tinypng.com_api_key"); |
||||
|
byte[] bytes = IoUtil.readBytes(new FileInputStream(output)); |
||||
|
Source source = Tinify.fromBuffer(bytes); |
||||
|
String name = output.getName(); |
||||
|
String compressedFileName = name.replace(".png", "-compressed.png"); |
||||
|
|
||||
|
byte[] compressedBytes = source.toBuffer(); |
||||
|
String compressedFilePath = tmp_folder.concat(compressedFileName); |
||||
|
File compressedFile = new File(compressedFilePath); |
||||
|
|
||||
|
Image newImage = ImageIO.read(new ByteArrayInputStream(compressedBytes)); |
||||
|
ImgUtil.write(newImage, compressedFile); |
||||
|
int compressionsThisMonth = Tinify.compressionCount(); |
||||
|
System.out.println("Compressions this month: " + compressionsThisMonth + "/500"); |
||||
|
System.out.println("Compressed image file name is " + compressedFileName + ". File size is " + getFileSize(compressedFilePath)); |
||||
|
// write to system clipboard
|
||||
|
setSysClipboard(newImage); |
||||
|
} |
||||
|
catch (IOException e) { |
||||
|
System.out.println(e); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
private String getNowTimeStr() { |
||||
|
LocalDateTime now = LocalDateTime.now(ZoneId.of("Asia/Shanghai")); |
||||
|
DateTimeFormatter dateFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); |
||||
|
DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("HH-mm-ss-SSS"); |
||||
|
String date = now.toLocalDate().format(dateFormatter); |
||||
|
String time = now.toLocalTime().format(timeFormatter); |
||||
|
return date.concat("_").concat(time); |
||||
|
} |
||||
|
} |
Loading…
Reference in new issue