ctbrec-5.3.2-experimental/client/src/main/java/ctbrec/ui/action/AbstractPortraitAction.java

85 lines
2.7 KiB
Java

package ctbrec.ui.action;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import java.nio.file.Files;
import javax.imageio.ImageIO;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import ctbrec.Config;
import ctbrec.Model;
import ctbrec.event.EventBusHolder;
import javafx.scene.Node;
public abstract class AbstractPortraitAction {
private static final Logger LOG = LoggerFactory.getLogger(AbstractPortraitAction.class);
public static final String FORMAT = "jpg";
protected Node source;
protected Model model;
protected BufferedImage convertToScaledJpg(BufferedImage original) {
java.awt.Image scaledPortrait = original.getScaledInstance(-1, 256, java.awt.Image.SCALE_SMOOTH);
BufferedImage bimage = new BufferedImage(scaledPortrait.getWidth(null), scaledPortrait.getHeight(null), BufferedImage.TYPE_INT_RGB);
Graphics2D bGr = bimage.createGraphics();
bGr.drawImage(scaledPortrait, 0, 0, null);
bGr.dispose();
return bimage;
}
protected boolean copyToCacheAsJpg(String portraitId, BufferedImage portrait) throws IOException {
File output = getPortraitFile(portraitId);
Files.createDirectories(output.getParentFile().toPath());
LOG.debug("Writing scaled portrait to {}", output);
return ImageIO.write(portrait, FORMAT, output);
}
protected File getPortraitFile(String portraitId) {
File configDir = Config.getInstance().getConfigDir();
File portraitDir = new File(configDir, "portraits");
File output = new File(portraitDir, portraitId + '.' + FORMAT);
return output;
}
protected BufferedImage cropImage(BufferedImage img) {
int w = img.getWidth();
int h = img.getHeight();
if (w > h) {
return cropSides(img);
} else {
return cropTopAndBottom(img);
}
}
protected BufferedImage cropSides(BufferedImage img) {
int overlap = img.getWidth() - img.getHeight();
return img.getSubimage(overlap / 2, 0, img.getHeight(), img.getHeight());
}
protected BufferedImage cropTopAndBottom(BufferedImage img) {
int overlap = img.getHeight() - img.getWidth();
return img.getSubimage(0, overlap/2, img.getWidth(), img.getWidth());
}
protected void firePortraitChanged() {
EventBusHolder.BUS.post(new PortraitChangedEvent(model));
}
public static class PortraitChangedEvent {
private Model mdl;
public PortraitChangedEvent(Model model) {
this.mdl = model;
}
public Model getModel() {
return mdl;
}
}
}