package org.dyndns.jkiddo.logic.desk; import java.awt.Graphics; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.IOException; import java.net.URI; import java.util.Collections; import java.util.Date; import java.util.HashMap; import java.util.Map; import java.util.Set; import javax.imageio.ImageIO; import net.coobird.thumbnailator.Thumbnails; import org.dyndns.jkiddo.dmp.util.DmapUtil; import org.dyndns.jkiddo.logic.interfaces.IImageStoreReader; import org.slf4j.Logger; import org.slf4j.LoggerFactory; public class DeskImageStoreReader implements IImageStoreReader { /** * */ private static final long serialVersionUID = -3205613907987224359L; private static final Logger LOGGER = LoggerFactory.getLogger(DeskImageStoreReader.class); private Map<IImageItem, File> mapOfImageToFile; private String path; public DeskImageStoreReader() { this(System.getProperty("user.dir") + System.getProperty("file.separator") + "etc"); this.mapOfImageToFile = new HashMap<>(); } public DeskImageStoreReader(String path) { this.mapOfImageToFile = new HashMap<>(); this.path = path; } @Override public Set<IImageItem> readImages() throws Exception { try { traverseRootPathRecursively(new File(path)); } catch(Exception e) { e.printStackTrace(); } return Collections.unmodifiableSet(mapOfImageToFile.keySet()); } private static boolean isImage(File f) { if(f.getPath().endsWith(".jpg") || f.getPath().endsWith(".jpeg")) return true; return false; } private void traverseRootPathRecursively(File f) throws IOException { if(f.isDirectory()) { File[] contents = f.listFiles(); if(contents != null) { for(int i = 0; i < contents.length; i++) { traverseRootPathRecursively(contents[i]); } } else LOGGER.debug("Symlink'ish ... " + f.getAbsolutePath()); } else if(isImage(f)) { mapOfImageToFile.put(populateImage(f), f); } } private IImageItem populateImage(final File f) throws IOException { final BufferedImage image = ImageIO.read(f); return new IImageItem() { @Override public String getImageFilename() { return f.getName(); } @Override public long getSize() { return f.length(); } @Override public String getFormat() { return "JPEG"; } @Override public int getRating() { return 5; } @Override public Date getCreationDate() { return new Date(); } @Override public int getImageWidth() { return image.getWidth(); } @Override public int getImageHeight() { return image.getHeight(); } }; } @Override public URI getImage(IImageItem image) throws Exception { if(image != null) { LOGGER.debug("Serving " + image.getImageFilename()); } return mapOfImageToFile.get(image).toURI(); } @Override public byte[] getImageThumb(IImageItem iimage) throws Exception { ByteArrayOutputStream baos = new ByteArrayOutputStream(); Thumbnails.of(getImage(iimage).toURL()).size(360, 360).outputFormat("jpg").toOutputStream(baos); return baos.toByteArray(); } private byte[] getImageThumbOld(IImageItem iimage) throws Exception { byte[] array = DmapUtil.uriTobuffer(getImage(iimage)); BufferedImage image = ImageIO.read(new ByteArrayInputStream(array)); int max = Math.max(image.getWidth(), image.getHeight()); float scale = 240.0f / max; int newW = (int) (image.getWidth() * scale); int newH = (int) (image.getHeight() * scale); BufferedImage scaledImage = new BufferedImage(newW, newH, image.getType()); Graphics g = scaledImage.getGraphics(); g.drawImage(image, 0, 0, newW, newH, null); ByteArrayOutputStream downscaledBytes = new ByteArrayOutputStream(); ImageIO.write(scaledImage, "jpeg", downscaledBytes); g.dispose(); return downscaledBytes.toByteArray(); } }