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; } } }