From ac0aa71c4db2992855f87c2ca8389dad6a86ba71 Mon Sep 17 00:00:00 2001 From: tpylak <tpylak> Date: Tue, 15 Feb 2011 15:50:14 +0000 Subject: [PATCH] fix: display a subset of channels with right colors when all channels are originally merged on one image SVN: 19985 --- .../server/images/ImageChannelsUtils.java | 46 +++++++++++++++++-- 1 file changed, 41 insertions(+), 5 deletions(-) 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 e45a433b7d7..1f50bd38599 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 @@ -680,17 +680,53 @@ public class ImageChannelsUtils ImageWithReference image = images.get(index); int rgb = image.getBufferedImage().getRGB(x, y); Color singleColor = new Color(rgb, true); - int channelIndex = image.getReference().getChannelIndex(); - for (int i : getRGBColorIndexes(channelIndex)) - { - colorBuffer[i] = Math.max(colorBuffer[i], extractMaxColorIngredient(singleColor)); - } + AbsoluteImageReference imageReference = image.getReference(); + setColorComponents(colorBuffer, singleColor, imageReference); // merge alpha channel colorBuffer[3] = Math.max(colorBuffer[3], singleColor.getAlpha()); } return asRGB(colorBuffer); } + private static void setColorComponents(int[] colorBuffer, Color singleColor, + AbsoluteImageReference imageReference) + { + ColorComponent colorComponent = imageReference.tryGetColorComponent(); + if (colorComponent != null) + { + int index = getColorComponentIndex(colorComponent); + colorBuffer[index] = colorComponent.getComponent(singleColor); + } else + { + int channelIndex = imageReference.getChannelIndex(); + setColorComponentsForChannelIndex(colorBuffer, singleColor, channelIndex); + } + } + + private static int getColorComponentIndex(ColorComponent colorComponent) + { + switch (colorComponent) + { + case RED: + return 0; + case GREEN: + return 1; + case BLUE: + return 2; + default: + throw new IllegalStateException("Unknown color " + colorComponent); + } + } + + private static void setColorComponentsForChannelIndex(int[] colorBuffer, Color singleColor, + int channelIndex) + { + for (int i : getRGBColorIndexes(channelIndex)) + { + colorBuffer[i] = Math.max(colorBuffer[i], extractMaxColorIngredient(singleColor)); + } + } + // --------- common private EnvironmentFailureException createImageNotFoundException( -- GitLab