/* * Copyright (C) 2003-2010 eXo Platform SAS. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU Affero General Public License * as published by the Free Software Foundation; either version 3 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, see<http://www.gnu.org/licenses/>. */ package org.exoplatform.social.core.image; import java.awt.RenderingHints; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileInputStream; import java.io.InputStream; import javax.imageio.ImageIO; import org.exoplatform.commons.utils.MimeTypeResolver; import org.exoplatform.services.log.ExoLogger; import org.exoplatform.services.log.Log; import org.exoplatform.social.core.model.AvatarAttachment; /** * @author tuan_nguyenxuan Oct 29, 2010 */ public class ImageUtils { public static final String KEY_SEPARATOR = "_"; public static final String KEY_DIMENSION_SEPARATOR = "x"; public static final String GIF_EXTENDSION = "gif"; private static final Log LOG = ExoLogger.getLogger(ImageUtils.class); /** * @param string Make string params not null */ private static void makeNotNull(String... str) { for (String string : str) { if (string == null) string = ""; } } /** * @param width * @param height * @return name of resized image name like from "avatar.jpg" to * "RESIZED_avatar_100x100.jpg" */ public static String buildFileName(String oldFileName, String subfix, String postfix) { makeNotNull(oldFileName,subfix,postfix); if(oldFileName.equals("")) return subfix + postfix; int dotIndex = oldFileName.lastIndexOf('.'); if(dotIndex < 0) return subfix + oldFileName + postfix; String nameOnly = oldFileName.substring(0, dotIndex); String extendtionAndDot = oldFileName.substring(dotIndex); return subfix + nameOnly + postfix + extendtionAndDot; } /** * @param width * @param height * @return postfix for image name like avatar_100x100 */ public static String buildImagePostfix(int width, int height) { return KEY_SEPARATOR + (width < 0 ? 0 : width) + KEY_DIMENSION_SEPARATOR + (height < 0 ? 0 : height); } /** * @param imageStream * @param width * @param height * @param avatarId * @param avatarFileName * @param avatarMimeType * @param avatarWorkspace * @return new AvatarAtachment that contain parameter values and resized * avatar */ public static AvatarAttachment createResizedAvatarAttachment(InputStream imageStream, int width, int height, String avatarId, String avatarFileName, String avatarMimeType, String avatarWorkspace) { try { MimeTypeResolver mimeTypeResolver = new MimeTypeResolver(); BufferedImage image = null; int minSize = 0; String extension = mimeTypeResolver.getExtension(avatarMimeType); // TODO: Resize gif image. Now we skip gif because we can't resize it now if (extension.equalsIgnoreCase(GIF_EXTENDSION)) return null; image = ImageIO.read(imageStream); if (height <= minSize & width <= minSize) { LOG.warn("Fail to resize image to avatar attachment with dimention <= 0x0"); return null; } if (height <= minSize) height = image.getHeight() * width / image.getWidth(); else if (width <= minSize) width = image.getWidth() * height / image.getHeight(); // Create temp file to store resized image to put to avatar attachment File tmp = File.createTempFile("RESIZED", null); ImageIO.write(org.apache.shindig.gadgets.rewrite.image.ImageUtils.getScaledInstance(image, width, height, RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR, false, BufferedImage.TYPE_INT_RGB), extension, tmp); // Create new avatar attachment AvatarAttachment newAvatarAttachment = new AvatarAttachment(avatarId, avatarFileName, avatarMimeType, new FileInputStream(tmp), avatarWorkspace, System.currentTimeMillis()); // Delete temp file tmp.delete(); return newAvatarAttachment; } catch (Exception e) { LOG.error("Fail to resize image to avatar attachment: " + e); return null; } } }