/******************************************************************************* * Copyright (c) 2016 Weasis Team and others. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at * http://www.eclipse.org/legal/epl-v10.html * * Contributors: * Nicolas Roduit - initial API and implementation *******************************************************************************/ package org.weasis.core.api.image; import java.awt.image.RenderedImage; import java.awt.image.renderable.ParameterBlock; import javax.media.jai.JAI; import javax.media.jai.ParameterBlockJAI; import javax.media.jai.PlanarImage; import javax.media.jai.operator.CompositeDescriptor; import javax.media.jai.operator.CropDescriptor; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.weasis.core.api.image.util.ImageFiler; import com.sun.media.jai.util.ImageUtil; public class MergeImgOp extends AbstractOp { private static final Logger LOGGER = LoggerFactory.getLogger(MergeImgOp.class); public static final String OP_NAME = "merge.img"; //$NON-NLS-1$ /** * The second image for merging operation (Required parameter). Note: calling clearIOCache will remove the parameter * value. * * java.awt.image.RenderedImage value. */ public static final String INPUT_IMG2 = "op.input.img.2"; //$NON-NLS-1$ /** * Opacity of the top image (Optional parameter). * * Integer value. Default value is 255 (highest value => no transparency). */ public static final String P_OPACITY = "opacity"; //$NON-NLS-1$ public MergeImgOp() { setName(OP_NAME); } public MergeImgOp(MergeImgOp op) { super(op); } @Override public MergeImgOp copy() { return new MergeImgOp(this); } @Override public void process() throws Exception { RenderedImage source = (RenderedImage) params.get(Param.INPUT_IMG); RenderedImage source2 = (RenderedImage) params.get(INPUT_IMG2); RenderedImage result = source; if (source2 != null) { Integer transparency = (Integer) params.get(P_OPACITY); result = MergeImgOp.combineTwoImages(source, source2, transparency == null ? 255 : transparency); } params.put(Param.OUTPUT_IMG, result); } public static PlanarImage combineTwoImages(RenderedImage sourceDown, RenderedImage sourceUp, int transparency) { Byte[] bandValues = new Byte[sourceDown.getSampleModel().getNumBands()]; for (int i = 0; i < bandValues.length; i++) { bandValues[i] = (byte) transparency; } PlanarImage alpha1 = ImageFiler.getEmptyImage(bandValues, sourceDown.getWidth(), sourceDown.getHeight()); ParameterBlock pb = new ParameterBlock(); if (sourceDown.getSampleModel().getNumBands() < sourceUp.getSampleModel().getNumBands()) { sourceDown = convertBinaryToColor(sourceDown); } else if (sourceUp.getSampleModel().getNumBands() < sourceDown.getSampleModel().getNumBands()) { sourceUp = convertBinaryToColor(sourceUp); } if (sourceDown.getWidth() < sourceUp.getWidth() || sourceDown.getHeight() < sourceUp.getHeight()) { sourceUp = CropDescriptor.create(sourceUp, 0.0f, 0.0f, (float) sourceDown.getWidth(), (float) sourceDown.getHeight(), null); } pb.addSource(formatIfBinary(sourceDown)); pb.addSource(alpha1); pb.add(formatIfBinary(sourceUp)); pb.add(null); pb.add(false); pb.add(CompositeDescriptor.NO_DESTINATION_ALPHA); return JAI.create("composite", pb, null); //$NON-NLS-1$ } public static PlanarImage combineTwoImages(RenderedImage sourceDown, RenderedImage sourceUp, PlanarImage alpha1) { ParameterBlock pb = new ParameterBlock(); if (sourceDown.getSampleModel().getNumBands() < sourceUp.getSampleModel().getNumBands()) { sourceDown = convertBinaryToColor(sourceDown); } else if (sourceUp.getSampleModel().getNumBands() < sourceDown.getSampleModel().getNumBands()) { sourceUp = convertBinaryToColor(sourceUp); } if (sourceDown.getWidth() < sourceUp.getWidth() || sourceDown.getHeight() < sourceUp.getHeight()) { sourceUp = CropDescriptor.create(sourceUp, 0.0f, 0.0f, (float) sourceDown.getWidth(), (float) sourceDown.getHeight(), null); } pb.addSource(formatIfBinary(sourceDown)); pb.addSource(formatIfBinary(sourceUp)); pb.add(formatIfBinary(alpha1)); pb.add(null); pb.add(false); pb.add(CompositeDescriptor.NO_DESTINATION_ALPHA); return JAI.create("composite", pb, null); //$NON-NLS-1$ } public static RenderedImage formatIfBinary(RenderedImage src) { if (src != null && ImageUtil.isBinary(src.getSampleModel())) { ParameterBlock pb = new ParameterBlock(); pb.addSource(src); return JAI.create("formatbinary", pb, null); //$NON-NLS-1$ } return src; } public static PlanarImage convertBinaryToColor(RenderedImage src) { RenderedImage img = formatIfBinary(src); ParameterBlockJAI pb2 = new ParameterBlockJAI("bandMerge"); //$NON-NLS-1$ pb2.addSource(img); pb2.addSource(img); pb2.addSource(img); return JAI.create("bandMerge", pb2, null); //$NON-NLS-1$ } }