package org.activiti.crystalball.diagram; /* * #%L * image-builder * %% * Copyright (C) 2012 - 2013 crystalball * %% * Licensed 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. * #L% */ import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Arrays; import java.util.Map; import java.util.logging.Level; /** * * */ public class MergeLayersGenerator extends AbstractProcessDiagramLayerGenerator { /** * merge all provided image layer into one. * images are merged in alphabetical order */ @Override public InputStream generateLayer(String imageType, Map<String, Object> params) { if (params == null ) return null; Object[] keys = params.keySet().toArray(); Arrays.sort( keys ); InputStream[] layers = new InputStream[params.size()]; int i = 0; for ( Object key : keys) { layers[ i++ ] = (InputStream) params.get( key.toString() ); } ByteArrayOutputStream os = new ByteArrayOutputStream(); InputStream fis = null; BufferedImage image; try { image = createBufferedImage( layers); ImageIO.write(image,"png", os); os.flush(); fis= new ByteArrayInputStream(os.toByteArray()); return fis; } catch (IOException e) { log.log(Level.SEVERE, "Unable to merge image layers ", e); return null; } finally { if (os != null) { try { os.close(); } catch (IOException e) { log.log(Level.SEVERE, "Unable to merge image layers ", e); } } } } protected BufferedImage createBufferedImage(InputStream[] isLayers) throws IOException { Image[] layers = new Image[isLayers.length]; for (int i = 0; i < isLayers.length; i++) { layers[i] = ImageIO.read( isLayers[i]); } Dimension maxSize = new Dimension(); for (int i = 0; i < layers.length; i++) { Dimension d = new Dimension(layers[i].getWidth(null), layers[i].getHeight(null)); maxSize = max(maxSize, d); } BufferedImage image = new BufferedImage(maxSize.width, maxSize.height, BufferedImage.TYPE_INT_ARGB); Graphics g = image.getGraphics(); for (int i = 0; i < layers.length; i++) { g.drawImage(layers[i], 0, 0, null); } g.dispose(); return image; } static protected Dimension max(Dimension a, Dimension b) { Dimension d = new Dimension(); d.width = Math.max(a.width, b.width); d.height = Math.max(a.height, b.height); return d; } }