package io.loli.sc.core;
import io.loli.sc.api.API;
import io.loli.sc.api.DropboxAPI;
import io.loli.sc.api.GDriveAPI;
import io.loli.sc.api.ImageCloudAPI;
import io.loli.sc.api.ImgurAPI;
import io.loli.sc.api.UploadException;
import io.loli.sc.config.Config;
import io.loli.sc.ui.MessageSender;
import io.loli.util.FileNameGenerator;
import java.awt.AWTException;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import org.apache.log4j.Logger;
public class ScreenCaptor {
private Config config;
private volatile String link;
private String apiStr;
private static Logger logger = Logger.getLogger(ScreenCaptor.class);
// 选择上传时不必保存
private ScreenCaptor(boolean upload) {
this.config = new Config();
}
private ScreenCaptor(String apiStr) {
this.config = new Config();
this.apiStr = apiStr;
File scf = this.screenShotSave();
link = this.uploadFile(scf);
}
private ScreenCaptor() {
this.config = new Config();
this.apiStr = config.getDefaultUpload();
File scf = this.screenShotSave();
link = this.uploadFile(scf);
}
public static ScreenCaptor newInstance(String apiStr) {
return new ScreenCaptor(apiStr);
}
public static ScreenCaptor newInstance() {
return new ScreenCaptor();
}
public static ScreenCaptor newInstance(boolean upload) {
return new ScreenCaptor(false);
}
private API getAPI() {
API api = null;
if (apiStr.equals("imgur")) {
api = new ImgurAPI(config);
} else if (apiStr.equals("dropbox")) {
api = new DropboxAPI(config);
} else if (apiStr.equals("gdrive")) {
api = new GDriveAPI(config);
} else if (apiStr.equals("screenshot.pics")) {
api = new ImageCloudAPI(config);
}
return api;
}
public static void copyToClipboard(String content) {
Clipboard cb = Toolkit.getDefaultToolkit().getSystemClipboard();
Transferable t = new StringSelection(content);
cb.setContents(t, null);
}
/**
* 截图
*
* @param savePath 保存图片的路径
* @return 图片文件
*/
public File screenShotSave() {
BufferedImage screenCapture = screenShot();
File imgFile = saveImageToFile(screenCapture);
return imgFile;
}
private File saveImageToFile(BufferedImage img) {
File f = new File(config.getSavePath() + File.separator
+ FileNameGenerator.generate(config.getFileNameFormat())
+ ".png");
try {
// png格式比jpg格式清晰很多
ImageIO.write(img, "png", f);
} catch (IOException e) {
logger.error("保存图片错误:" + e.getMessage());
MessageSender.getInstance().showDialog("保存图片错误:" + e.getMessage());
}
return f;
}
private String uploadFile(File file) {
String s = null;
try {
s = this.getAPI().upload(file);
} catch (UploadException e) {
logger.error("上传图片出错,错误信息为" + e.getMessage());
MessageSender.getInstance().showDialog(
"上传图片出错,错误信息为" + e.getMessage());
}
return s;
}
public String uploadImage(String apiStr, BufferedImage image) {
this.apiStr = apiStr;
return uploadFile(saveImageToFile(image));
}
/**
* 判断系统,并调用相应系统下的方法
*
* @return
*/
public static BufferedImage screenShot() {
String system = System.getProperty("os.name").toLowerCase();
if (system.indexOf("windows") >= 0) {
return winScreenShot();
} else if (system.indexOf("linux") >= 0) {
return linuxScreenShot();
} else if (system.indexOf("mac") >= 0) {
return macScreenShot();
} else {
return winScreenShot();
}
}
/**
* linux下的截图
*
* @return 返回截图的BufferedImage对象
*/
private static BufferedImage linuxScreenShot() {
File file = new File(System.getProperty("java.io.tmpdir"),
FileNameGenerator.generate() + ".png");
try {
// 需要加waitFor()等待执行结束
Runtime.getRuntime()
.exec(new String[] { "/bin/sh", "-c",
"import -window root " + file.getCanonicalPath() })
.waitFor();
} catch (IOException | InterruptedException e) {
logger.warn("执行linux下的截图命令出错,错误原因为:" + e.getMessage());
}
BufferedImage screenCapture = null;
try {
screenCapture = ImageIO.read(file);
} catch (IOException e) {
logger.warn("读取生成的图片出错,使用windows的截图方式替代:" + e.getMessage());
screenCapture = winScreenShot();
}
return screenCapture;
}
/**
* windows下的截图
*
* @return 返回截图的BufferedImage对象
*/
public static BufferedImage winScreenShot() {
Rectangle screen = new Rectangle(Toolkit.getDefaultToolkit()
.getScreenSize());
BufferedImage screenCapture = null;
try {
screenCapture = new Robot().createScreenCapture(screen);
} catch (AWTException e1) {
logger.error("截图出错,错误原因为:" + e1.getMessage());
}
return screenCapture;
}
/**
* mac下的截图
*
* @return 返回截图的BufferedImage对象
*/
private static BufferedImage macScreenShot() {
File file = new File(System.getProperty("java.io.tmpdir"),
FileNameGenerator.generate() + ".png");
try {
// 需要加waitFor()等待执行结束
Runtime.getRuntime()
.exec(new String[] { "/bin/sh", "-c",
"screencapture " + file.getCanonicalPath() })
.waitFor();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
}
BufferedImage screenCapture = null;
try {
screenCapture = ImageIO.read(file);
} catch (IOException e) {
e.printStackTrace();
}
return screenCapture;
}
public String getLink() {
while (link == null || link.equals("")) {
}
return link;
}
public void setConfig(Config config) {
this.config = config;
}
}