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 e45a433b7d74ec72a1cdbed492f4bed38b86b917..1f50bd38599f764c69e074b7f7a7a43684c78207 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(