diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/AbsoluteImageReference.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/AbsoluteImageReference.java index 1adc6e9a4c3a8e4b8a896f983c9f749efc977c13..27c9c41fe7f00eb35d7af58ff2a3105993c24ec0 100644 --- a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/AbsoluteImageReference.java +++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/AbsoluteImageReference.java @@ -16,9 +16,12 @@ package ch.systemsx.cisd.openbis.dss.etl; +import java.awt.image.BufferedImage; + import ch.systemsx.cisd.common.io.IContent; import ch.systemsx.cisd.openbis.dss.etl.dto.ImageTransfomationFactories; import ch.systemsx.cisd.openbis.dss.generic.server.images.dto.RequestedImageSize; +import ch.systemsx.cisd.openbis.dss.generic.shared.utils.ImageUtil; import ch.systemsx.cisd.openbis.plugin.screening.shared.imaging.dataaccess.ColorComponent; /** @@ -30,13 +33,15 @@ import ch.systemsx.cisd.openbis.plugin.screening.shared.imaging.dataaccess.Color public class AbsoluteImageReference extends AbstractImageReference { private final IContent content; - + private final String uniqueId; private final RequestedImageSize imageSize; private final ImageTransfomationFactories imageTransfomationFactories; + private BufferedImage image; + // This is an artificial value which helps to keep coloring channels constant. Starts with 0. // Unique for a given experiment or dataset (if channels are per dataset). private int channelIndex; @@ -72,6 +77,15 @@ public class AbsoluteImageReference extends AbstractImageReference { return content; } + + public BufferedImage getImage() + { + if (image == null) + { + image = ImageUtil.loadImage(content, tryGetPage()); + } + return image; + } public RequestedImageSize getRequestedSize() { diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/dataaccess/ImagingDatasetLoader.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/dataaccess/ImagingDatasetLoader.java index c24810d9657f77db13f96cc407a0fd450dbf4f55..bb85b38b5352661d152ee9ad6649f6b8d875604a 100644 --- a/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/dataaccess/ImagingDatasetLoader.java +++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/etl/dataaccess/ImagingDatasetLoader.java @@ -16,6 +16,8 @@ package ch.systemsx.cisd.openbis.dss.etl.dataaccess; +import java.awt.image.BufferedImage; + import org.apache.commons.lang.StringUtils; import ch.systemsx.cisd.base.image.IImageTransformerFactory; @@ -30,6 +32,7 @@ import ch.systemsx.cisd.openbis.dss.generic.server.images.dto.ImageChannelStackR import ch.systemsx.cisd.openbis.dss.generic.server.images.dto.ImageChannelStackReference.HCSChannelStackByLocationReference; import ch.systemsx.cisd.openbis.dss.generic.server.images.dto.ImageChannelStackReference.MicroscopyChannelStackByLocationReference; import ch.systemsx.cisd.openbis.dss.generic.server.images.dto.RequestedImageSize; +import ch.systemsx.cisd.openbis.dss.generic.shared.dto.Size; import ch.systemsx.cisd.openbis.plugin.screening.shared.imaging.HCSDatasetLoader; import ch.systemsx.cisd.openbis.plugin.screening.shared.imaging.dataaccess.ColorComponent; import ch.systemsx.cisd.openbis.plugin.screening.shared.imaging.dataaccess.IImagingReadonlyQueryDAO; @@ -82,6 +85,21 @@ public class ImagingDatasetLoader extends HCSDatasetLoader implements IImagingDa return null; } AbsoluteImageReference imgRef = createAbsoluteImageReference(imageDTO, channel, imageSize); + if (thumbnailPrefered) + { + Size requestedThumbnailSize = imageSize.tryGetThumbnailSize(); + BufferedImage image = imgRef.getImage(); + double width = 1.5 * image.getWidth(); + double height = 1.5 * image.getHeight(); + if (requestedThumbnailSize.getWidth() > width || requestedThumbnailSize.getHeight() > height) + { + imageDTO = tryGetImageDTO(channelStackReference, false, channel.getId(), datasetId); + if (imageDTO != null) + { + imgRef = createAbsoluteImageReference(imageDTO, channel, imageSize); + } + } + } return imgRef; } diff --git a/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/images/ImageChannelsUtils.java b/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/images/ImageChannelsUtils.java index 54268f601a0f8872d7cf39a45e82be92fd950218..45536f929b755301703ccafaac8e86b606ed5e03 100644 --- a/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/images/ImageChannelsUtils.java +++ b/screening/source/java/ch/systemsx/cisd/openbis/dss/generic/server/images/ImageChannelsUtils.java @@ -430,7 +430,7 @@ public class ImageChannelsUtils private static BufferedImage calculateSingleImage(AbsoluteImageReference imageReference) { long start = operationLog.isDebugEnabled() ? System.currentTimeMillis() : 0; - BufferedImage image = loadImage(imageReference); + BufferedImage image = imageReference.getImage(); if (operationLog.isDebugEnabled()) { operationLog.debug("Load original image: " + (System.currentTimeMillis() - start)); @@ -468,11 +468,6 @@ public class ImageChannelsUtils return image; } - private static BufferedImage loadImage(AbsoluteImageReference imageReference) - { - return ImageUtil.loadImage(imageReference.getContent(), imageReference.tryGetPage()); - } - /** * @param allChannelsMerged if true then we use one special transformation on the merged images * instead of transforming every single image.