package org.aplikator.server; import javax.activation.FileTypeMap; import javax.activation.MimeType; import javax.activation.MimeTypeParseException; import javax.activation.MimetypesFileTypeMap; import javax.imageio.ImageIO; import javax.swing.*; import java.awt.*; import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.util.logging.Level; import java.util.logging.Logger; import org.aplikator.server.descriptor.BinaryProperty; import org.imgscalr.Scalr; import net.coobird.thumbnailator.Thumbnails; public class ImageResizer { private static final Logger LOG = Logger.getLogger(ImageResizer.class.getName()); private static MimetypesFileTypeMap mimeTypes; /** * Resize the input picture (byte array/ImageIcon) to fit the given maximum * size. * Supports JPEG, PNG, GIF and TIFF. For other file types returns null. * * @param maxSize * @return JPEG encoded byte array of resized picture */ public static byte[] resize(BufferedImage srcImage, int maxSize) { //BufferedImage imageWithoutAlpha = new BufferedImage(srcImage.getWidth(), srcImage.getHeight(), BufferedImage.TYPE_INT_RGB); //Graphics g = imageWithoutAlpha.getGraphics(); //try { // g.drawImage(srcImage, 0, 0, null); String resizer = Configurator.get().getConfig().getString(Configurator.IMAGE_RESIZER); if ("scalr".equals(resizer)) { return resizeWithScalr(srcImage, maxSize); } else if ("aplikator".equals(resizer)) { return resizeWithOldAplikator(srcImage, maxSize); } else { return resizeWithThumbnailator(srcImage, maxSize); } //}finally{ // g.dispose(); // imageWithoutAlpha.flush(); // } } public static BufferedImage removeAlphaChannel(BufferedImage srcImage) { BufferedImage imageWithoutAlpha = new BufferedImage(srcImage.getWidth(), srcImage.getHeight(), BufferedImage.TYPE_INT_RGB); Graphics g = imageWithoutAlpha.getGraphics(); try { g.drawImage(srcImage, 0, 0, null); return imageWithoutAlpha; } finally { g.dispose(); srcImage.flush(); } } public static byte[] resizeWithScalr(BufferedImage srcImage, int maxSize) { byte[] retval = null; try { int originalX = srcImage.getWidth(); int originalY = srcImage.getHeight(); if (originalX <= maxSize && originalY <= maxSize) { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); retval = outputStream.toByteArray(); ImageIO.write(srcImage, "jpg", outputStream); retval = outputStream.toByteArray(); } else { BufferedImage scaledImage = Scalr.resize(srcImage, maxSize); ByteArrayOutputStream os = new ByteArrayOutputStream(); ImageIO.write(scaledImage, "jpg", os); retval = os.toByteArray(); os.close(); } } catch (Exception ex) { LOG.log(Level.SEVERE, "Error in image resizer:", ex); } return retval; } public static byte[] resizeWithThumbnailator(BufferedImage srcImage, int maxSize) { byte[] retval = null; try { int originalX = srcImage.getWidth(); int originalY = srcImage.getHeight(); if (originalX <= maxSize && originalY <= maxSize) { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); retval = outputStream.toByteArray(); ImageIO.write(srcImage, "jpg", outputStream); retval = outputStream.toByteArray(); } else { ByteArrayOutputStream os = new ByteArrayOutputStream(); Thumbnails.of(srcImage) .size(maxSize, maxSize) .outputFormat("jpg") .toOutputStream(os); retval = os.toByteArray(); os.close(); } } catch (Exception ex) { LOG.log(Level.SEVERE, "Error in image resizer:", ex); } return retval; } /** * Resize the input picture (byte array/ImageIcon) to fit the given maximum * size. * Supports JPEG, PNG, GIF and TIFF. For other file types returns null. * * @param maxSize * @return JPEG encoded byte array of resized picture */ public static byte[] resizeWithOldAplikator(BufferedImage sourceImage, int maxSize) { byte[] retval = null; try { int originalX = sourceImage.getWidth(); int originalY = sourceImage.getHeight(); if (originalX <= maxSize && originalY <= maxSize) { ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); retval = outputStream.toByteArray(); ImageIO.write(sourceImage, "jpg", outputStream); retval = outputStream.toByteArray(); } else { int calculatedX; int calculatedY; if (originalX >= originalY) { calculatedX = maxSize; float ratio = originalX / (float) maxSize; calculatedY = Math.round(originalY / ratio); } else { calculatedY = maxSize; float ratio = originalY / (float) maxSize; calculatedX = Math.round(originalX / ratio); } // scale the image Image targetImage = sourceImage.getScaledInstance(calculatedX, calculatedY, Image.SCALE_AREA_AVERAGING); MediaTracker mediaTracker = new MediaTracker(new JLabel()); mediaTracker.addImage(targetImage, 0); mediaTracker.waitForAll(); // encode output as JPEG BufferedImage outputImage = new BufferedImage(calculatedX, calculatedY, BufferedImage.TYPE_INT_RGB); Graphics graphics = outputImage.createGraphics(); graphics.drawImage(targetImage, 0, 0, null); graphics.dispose(); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); retval = outputStream.toByteArray(); ImageIO.write(outputImage, "jpg", outputStream); retval = outputStream.toByteArray(); } } catch (Exception ex) { LOG.log(Level.SEVERE, "Error in image resizer:", ex); } return retval; } public static boolean isResizeable(BinaryProperty binaryProperty, String fileName) { if (!binaryProperty.isGenerateThumbnails()) { return false; } MimeType mimeType = null; try { mimeType = getMimeType(fileName); } catch (MimeTypeParseException e) { return false; } return "image".equals(mimeType.getPrimaryType()) || isPdf(fileName); } public static boolean isPdf(String fileName) { MimeType mimeType = null; try { mimeType = getMimeType(fileName); } catch (MimeTypeParseException e) { return false; } return "application".equals(mimeType.getPrimaryType()) && "pdf".equalsIgnoreCase(mimeType.getSubType()); } /** * Determine the Mime type based on file extension * * @param fileName * @return * @throws MimeTypeParseException */ public static MimeType getMimeType(String fileName) throws MimeTypeParseException { if (fileName == null) { return new MimeType("application", "octet"); } if (mimeTypes == null) { mimeTypes = (MimetypesFileTypeMap) FileTypeMap.getDefaultFileTypeMap(); mimeTypes.addMimeTypes("application/msword doc DOC"); mimeTypes.addMimeTypes("application/vnd.ms-excel xls XLS"); mimeTypes.addMimeTypes("application/pdf pdf PDF"); mimeTypes.addMimeTypes("text/xml xml XML"); mimeTypes.addMimeTypes("text/html html htm HTML HTM"); mimeTypes.addMimeTypes("text/plain txt text TXT TEXT"); mimeTypes.addMimeTypes("image/gif gif GIF"); mimeTypes.addMimeTypes("image/ief ief"); mimeTypes.addMimeTypes("image/jpeg jpeg jpg jpe JPG"); mimeTypes.addMimeTypes("image/tiff tiff tif"); mimeTypes.addMimeTypes("image/png png PNG"); mimeTypes.addMimeTypes("image/x-xwindowdump xwd"); mimeTypes.addMimeTypes("application/postscript ai eps ps"); mimeTypes.addMimeTypes("application/rtf rtf"); mimeTypes.addMimeTypes("application/x-tex tex"); mimeTypes.addMimeTypes("application/x-texinfo texinfo texi"); mimeTypes.addMimeTypes("application/x-troff t tr roff"); mimeTypes.addMimeTypes("audio/basic au"); mimeTypes.addMimeTypes("audio/midi midi mid"); mimeTypes.addMimeTypes("audio/x-aifc aifc"); mimeTypes.addMimeTypes("audio/x-aiff aif aiff"); mimeTypes.addMimeTypes("audio/x-mpeg mpeg mpg"); mimeTypes.addMimeTypes("audio/x-wav wav"); mimeTypes.addMimeTypes("video/mpeg mpeg mpg mpe"); mimeTypes.addMimeTypes("video/quicktime qt mov"); mimeTypes.addMimeTypes("video/x-msvideo avi"); } return new MimeType(mimeTypes.getContentType(fileName.toLowerCase())); } } /* * * BufferedImage image = ImageIO.read(new File("c:\picture.jpg")); * * * private static BufferedImage resize(BufferedImage image, int width, int * height) { BufferedImage resizedImage = new BufferedImage(width, height, * BufferedImage.TYPE_INT_ARGB); Graphics2D g = resizedImage.createGraphics(); * g.drawImage(image, 0, 0, width, height, null); g.dispose(); return * resizedImage; } * * ImageIO.write(resized, "png", new File("c:\picture1.png")); * * * private static BufferedImage resize(BufferedImage image, int width, int * height) { int type = image.getType() == 0? BufferedImage.TYPE_INT_ARGB : * image.getType(); BufferedImage resizedImage = new BufferedImage(width, * height, type); Graphics2D g = resizedImage.createGraphics(); * g.setComposite(AlphaComposite.Src); * * g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, * RenderingHints.VALUE_INTERPOLATION_BILINEAR); * * g.setRenderingHint(RenderingHints.KEY_RENDERING, * RenderingHints.VALUE_RENDER_QUALITY); * * g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, * RenderingHints.VALUE_ANTIALIAS_ON); * * g.drawImage(image, 0, 0, width, height, null); g.dispose(); return * resizedImage; } * * * PDF: https://pdf-renderer.dev.java.net/examples.html */