blob: 7d50f0e2007a75256ca67e6bc0fc01513c9b5509 [file] [log] [blame]
/*******************************************************************************
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*******************************************************************************/
package org.ofbiz.common.image;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.List;
import java.util.Locale;
import java.util.Map;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.xml.parsers.ParserConfigurationException;
import javolution.util.FastMap;
import org.ofbiz.base.util.Debug;
import org.ofbiz.base.util.UtilProperties;
import org.ofbiz.base.util.UtilXml;
import org.xml.sax.SAXException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
/**
* ImageTransform Class
* <p>
* Services to apply transformation to images
*/
public class ImageTransform {
public static final String module = ImageTransform.class.getName();
public static final String resource = "CommonErrorUiLabels";
public ImageTransform() {
}
/**
* getBufferedImage
* <p>
* Set a buffered image
*
* @param fileLocation Full file Path or URL
* @return URL images for all different size types
* @throws IOException Error prevents the document from being fully parsed
* @throws JDOMException Errors occur in parsing
*/
public static Map<String, Object> getBufferedImage(String fileLocation, Locale locale)
throws IllegalArgumentException, IOException {
/* VARIABLES */
BufferedImage bufImg;
Map<String, Object> result = FastMap.newInstance();
/* BUFFERED IMAGE */
try {
bufImg = ImageIO.read(new File(fileLocation));
} catch (IllegalArgumentException e) {
String errMsg = UtilProperties.getMessage(resource, "ImageTransform.input_is_null", locale) + " : " + fileLocation + " ; " + e.toString();
Debug.logError(errMsg, module);
result.put("errorMessage", errMsg);
return result;
} catch (IOException e) {
String errMsg = UtilProperties.getMessage(resource, "ImageTransform.error_occurs_during_reading", locale) + " : " + fileLocation + " ; " + e.toString();
Debug.logError(errMsg, module);
result.put("errorMessage", errMsg);
return result;
}
result.put("responseMessage", "success");
result.put("bufferedImage", bufImg);
return result;
}
/**
* scaleImage
* <p>
* scale original image related to the ImageProperties.xml dimensions
*
* @param bufImg Buffered image to scale
* @param imgHeight Original image height
* @param imgWidth Original image width
* @param dimensionMap Image dimensions by size type
* @param sizeType Size type to scale
* @return New scaled buffered image
*/
public static Map<String, Object> scaleImage(BufferedImage bufImg, double imgHeight, double imgWidth, Map<String, Map<String, String>> dimensionMap, String sizeType, Locale locale) {
/* VARIABLES */
BufferedImage bufNewImg;
double defaultHeight, defaultWidth, scaleFactor;
Map<String, Object> result = FastMap.newInstance();
/* DIMENSIONS from ImageProperties */
// A missed dimension is authorized
if (dimensionMap.get(sizeType).containsKey("height")) {
defaultHeight = Double.parseDouble(dimensionMap.get(sizeType).get("height").toString());
} else {
defaultHeight = -1;
}
if (dimensionMap.get(sizeType).containsKey("width")) {
defaultWidth = Double.parseDouble(dimensionMap.get(sizeType).get("width").toString());
} else {
defaultWidth = -1;
}
if (defaultHeight == 0.0 || defaultWidth == 0.0) {
String errMsg = UtilProperties.getMessage(resource, "ImageTransform.one_default_dimension_is_null", locale) + " : defaultHeight = " + defaultHeight + " ; defaultWidth = " + defaultWidth;
Debug.logError(errMsg, module);
result.put("errorMessage", errMsg);
return result;
}
/* SCALE FACTOR */
// find the right Scale Factor related to the Image Dimensions
if (defaultHeight == -1) {
scaleFactor = defaultWidth / imgWidth;
if (scaleFactor == 0.0) {
String errMsg = UtilProperties.getMessage(resource, "ImageTransform.width_scale_factor_is_null", locale) + " (defaultWidth = " + defaultWidth + "; imgWidth = " + imgWidth;
Debug.logError(errMsg, module);
result.put("errorMessage", errMsg);
return result;
}
} else if (defaultWidth == -1) {
scaleFactor = defaultHeight / imgHeight;
if (scaleFactor == 0.0) {
String errMsg = UtilProperties.getMessage(resource, "ImageTransform.height_scale_factor_is_null", locale) + " (defaultHeight = " + defaultHeight + "; imgHeight = " + imgHeight;
Debug.logError(errMsg, module);
result.put("errorMessage", errMsg);
return result;
}
} else if (imgHeight > imgWidth) {
scaleFactor = defaultHeight / imgHeight;
if (scaleFactor == 0.0) {
String errMsg = UtilProperties.getMessage(resource, "ImageTransform.height_scale_factor_is_null", locale) + " (defaultHeight = " + defaultHeight + "; imgHeight = " + imgHeight;
Debug.logError(errMsg, module);
result.put("errorMessage", errMsg);
return result;
}
// get scaleFactor from the smallest width
if (defaultWidth < (imgWidth * scaleFactor)) {
scaleFactor = defaultWidth / imgWidth;
}
} else {
scaleFactor = defaultWidth / imgWidth;
if (scaleFactor == 0.0) {
String errMsg = UtilProperties.getMessage(resource, "ImageTransform.width_scale_factor_is_null", locale) + " (defaultWidth = " + defaultWidth + "; imgWidth = " + imgWidth;
Debug.logError(errMsg, module);
result.put("errorMessage", errMsg);
return result;
}
// get scaleFactor from the smallest height
if (defaultHeight < (imgHeight * scaleFactor)) {
scaleFactor = defaultHeight / imgHeight;
}
}
if (scaleFactor == 0.0) {
String errMsg = UtilProperties.getMessage(resource, "ImageTransform.final_scale_factor_is_null", locale) + " = " + scaleFactor;
Debug.logError(errMsg, module);
result.put("errorMessage", errMsg);
return result;
}
int bufImgType;
if (BufferedImage.TYPE_CUSTOM == bufImg.getType()) {
String errMsg = UtilProperties.getMessage(resource, "ImageTransform.unknown_buffered_image_type", locale);
Debug.logWarning(errMsg, module);
// apply a type for image majority
bufImgType = BufferedImage.TYPE_INT_ARGB_PRE;
} else {
bufImgType = bufImg.getType();
}
// scale original image with new size
Image newImg = bufImg.getScaledInstance((int) (imgWidth * scaleFactor), (int) (imgHeight * scaleFactor), Image.SCALE_SMOOTH);
bufNewImg = ImageTransform.toBufferedImage(newImg, bufImgType);
result.put("responseMessage", "success");
result.put("bufferedImage", bufNewImg);
result.put("scaleFactor", scaleFactor);
return result;
}
/**
* getXMLValue
* <p>
* From a XML element, get a values map
*
* @param fileFullPath File path to parse
* @return Map contains asked attribute values by attribute name
*/
public static Map<String, Object> getXMLValue(String fileFullPath, Locale locale)
throws IllegalStateException, IOException {
/* VARIABLES */
Document document;
Element rootElt;
Map<String, Map<String, String>> valueMap = FastMap.newInstance();
Map<String, Object> result = FastMap.newInstance();
/* PARSING */
try {
document = UtilXml.readXmlDocument(new FileInputStream(fileFullPath), fileFullPath);
} catch (ParserConfigurationException e) {
String errMsg = UtilProperties.getMessage(resource, "ImageTransform.errors_occurred_during_parsing", locale) + " ImageProperties.xml " + e.toString();
Debug.logError(errMsg, module);
result.put("errorMessage", "error");
return result;
} catch (SAXException e) {
String errMsg = UtilProperties.getMessage(resource, "ImageTransform.errors_occurred_during_parsing", locale) + " ImageProperties.xml " + e.toString();
Debug.logError(errMsg, module);
result.put("errorMessage", "error");
return result;
} catch (IOException e) {
String errMsg = UtilProperties.getMessage(resource, "ImageTransform.error_prevents_the document_from_being_fully_parsed", locale) + e.toString();
Debug.logError(errMsg, module);
result.put("errorMessage", "error");
return result;
}
// set Root Element
try {
rootElt = document.getDocumentElement();
} catch (IllegalStateException e) {
String errMsg = UtilProperties.getMessage(resource, "ImageTransform.root_element_has_not_been_set", locale) + e.toString();
Debug.logError(errMsg, module);
result.put("errorMessage", "error");
return result;
}
/* get NAME and VALUE */
List<? extends Element> children = UtilXml.childElementList(rootElt); // FIXME : despite upgrading to jdom 1.1, it seems that getChildren is pre 1.5 java code (ie getChildren does not retun List<Element> but only List)
for (Element currentElt : children) {
Map<String, String> eltMap = FastMap.newInstance();
List<? extends Element> children2 = UtilXml.childElementList(currentElt);
if (children2.size() > 0) {
Map<String, String> childMap = FastMap.newInstance();
// loop over Children 1st level
for (Element currentChild : children2) {
childMap.put(currentChild.getAttribute("name"), currentChild.getAttribute("value"));
}
valueMap.put(currentElt.getAttribute("name"), childMap);
} else {
eltMap.put(currentElt.getAttribute("name"), currentElt.getAttribute("value"));
valueMap.put(currentElt.getNodeName(), eltMap);
}
}
result.put("responseMessage", "success");
result.put("xml", valueMap);
return result;
}
/**
* toBufferedImage
* <p>
* Transform from an Image instance to a BufferedImage instance
*
* @param image Source image
* @return BufferedImage
*/
public static BufferedImage toBufferedImage(Image image) {
return ImageTransform.toBufferedImage(image, BufferedImage.TYPE_INT_ARGB_PRE);
}
public static BufferedImage toBufferedImage(Image image, int bufImgType) {
/** Check if the image isn't already a BufferedImage instance */
if( image instanceof BufferedImage ) {
return( (BufferedImage)image );
} else {
/** Full image loading */
image = new ImageIcon(image).getImage();
/** new BufferedImage creation */
BufferedImage bufferedImage = new BufferedImage(
image.getWidth(null),
image.getHeight(null),
bufImgType);
Graphics2D g = bufferedImage.createGraphics();
g.drawImage(image,0,0,null);
g.dispose();
return( bufferedImage );
}
}
}