/******************************************************************************* * 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.dicom.codec.display; import java.awt.image.RenderedImage; import java.io.IOException; import java.util.HashMap; import java.util.Optional; import javax.media.jai.PlanarImage; import org.dcm4che3.data.Tag; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.weasis.core.api.gui.util.ActionW; import org.weasis.core.api.gui.util.JMVUtils; import org.weasis.core.api.image.AbstractOp; import org.weasis.core.api.image.ImageOpEvent; import org.weasis.core.api.image.ImageOpEvent.OpEvent; import org.weasis.core.api.image.MergeImgOp; import org.weasis.core.api.media.data.ImageElement; import org.weasis.core.api.media.data.TagW; import org.weasis.dicom.codec.DicomMediaIO; import org.weasis.dicom.codec.PRSpecialElement; import org.weasis.dicom.codec.PresentationStateReader; import org.weasis.dicom.codec.TagD; import org.weasis.dicom.codec.utils.OverlayUtils; public class OverlayOp extends AbstractOp { private static final Logger LOGGER = LoggerFactory.getLogger(OverlayOp.class); public static final String OP_NAME = ActionW.IMAGE_OVERLAY.getTitle(); public static final String P_SHOW = "overlay"; //$NON-NLS-1$ public static final String P_PR_ELEMENT = "pr.element"; //$NON-NLS-1$ public static final String P_IMAGE_ELEMENT = "img.element"; //$NON-NLS-1$ public OverlayOp() { setName(OP_NAME); } public OverlayOp(OverlayOp op) { super(op); } @Override public OverlayOp copy() { return new OverlayOp(this); } @Override public void handleImageOpEvent(ImageOpEvent event) { OpEvent type = event.getEventType(); if (OpEvent.ImageChange.equals(type) || OpEvent.ResetDisplay.equals(type)) { setParam(P_PR_ELEMENT, null); setParam(P_IMAGE_ELEMENT, event.getImage()); } else if (OpEvent.ApplyPR.equals(type)) { HashMap<String, Object> p = event.getParams(); if (p != null) { setParam(P_PR_ELEMENT, Optional.ofNullable(p.get(ActionW.PR_STATE.cmd())) .filter(PRSpecialElement.class::isInstance).orElse(null)); setParam(P_IMAGE_ELEMENT, event.getImage()); } } } @Override public void process() throws Exception { RenderedImage source = (RenderedImage) params.get(Param.INPUT_IMG); RenderedImage result = source; Boolean overlay = (Boolean) params.get(P_SHOW); if (overlay != null && overlay) { RenderedImage imgOverlay = null; ImageElement image = (ImageElement) params.get(P_IMAGE_ELEMENT); if (image != null) { boolean overlays = JMVUtils.getNULLtoFalse(image.getTagValue(TagW.HasOverlay)); if (overlays && image.getMediaReader() instanceof DicomMediaIO) { DicomMediaIO reader = (DicomMediaIO) image.getMediaReader(); try { if (image.getKey() instanceof Integer) { int frame = (Integer) image.getKey(); Integer height = TagD.getTagValue(image, Tag.Rows, Integer.class); Integer width = TagD.getTagValue(image, Tag.Columns, Integer.class); if (height != null && width != null) { imgOverlay = PlanarImage.wrapRenderedImage(OverlayUtils.getBinaryOverlays(image, reader.getDicomObject(), frame, width, height, params)); } } } catch (IOException e) { LOGGER.error("Applying overlays", e); //$NON-NLS-1$ } } } result = imgOverlay == null ? source : MergeImgOp.combineTwoImages(source, imgOverlay, 255); } params.put(Param.OUTPUT_IMG, result); } }