diff --git a/common/source/java/ch/systemsx/cisd/common/image/MixColors.java b/common/source/java/ch/systemsx/cisd/common/image/MixColors.java index 551a311c3bda3b3167eff92a4e3684133ac2757e..68bfc57747ef9588559ec6cc7812dae0017ce67e 100644 --- a/common/source/java/ch/systemsx/cisd/common/image/MixColors.java +++ b/common/source/java/ch/systemsx/cisd/common/image/MixColors.java @@ -18,7 +18,6 @@ package ch.systemsx.cisd.common.image; import java.awt.Color; import java.awt.image.BufferedImage; -import java.awt.image.ColorModel; import org.apache.log4j.Logger; @@ -274,14 +273,51 @@ public class MixColors int width = images[0].getWidth(); int height = images[0].getHeight(); - final BufferedImage mixed = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); - for (int y = 0; y < images[0].getHeight(); ++y) + final Color[][] notNormalizedPixels = new Color[width][height]; + float whitePointSumIntencity = 0f; + Color whitePointColor = new Color(0); + final float[] mixedComponents = new float[4]; + + // store the colours and calculate white point + for (int y = 0; y < height; ++y) { - for (int x = 0; x < images[0].getWidth(); ++x) + for (int x = 0; x < width; ++x) { Color mixColor = mergeColorsAlgorithm.merge(colors, x, y, images); - mixed.setRGB(x, y, mixColor.getRGB()); + notNormalizedPixels[x][y] = mixColor; + + mixColor.getRGBColorComponents(mixedComponents); + float sumIntencity = 0f; + for (int i = 0; i < mixedComponents.length; i++) + { + sumIntencity += mixedComponents[i]; + } + + if (whitePointSumIntencity < sumIntencity) + { + whitePointColor = mixColor; + whitePointSumIntencity = sumIntencity; + } + } + } + + final float whitePointFactor = 255f / getMaxComponent(whitePointColor.getRed(), whitePointColor.getGreen(), whitePointColor.getBlue()); + + final BufferedImage mixed = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); + + // apply white point adjustments to the final image + for (int y = 0; y < height; ++y) + { + for (int x = 0; x < width; ++x) + { + notNormalizedPixels[x][y].getRGBColorComponents(mixedComponents); + for (int i = 0; i < mixedComponents.length; i++) + { + mixedComponents[i] *= whitePointFactor; + } + + mixed.setRGB(x, y, new Color(images[0].getColorModel().getColorSpace(), mixedComponents, 1).getRGB()); } } return mixed; @@ -326,20 +362,6 @@ public class MixColors for (int i = 0; i < numberOfImages; ++i) { isGrayscale = isGrayscale && images[i].getColorModel().getNumColorComponents() == 1; - ColorModel colorModel = images[i].getColorModel(); - int componentSize; - try - { - componentSize = colorModel.getComponentSize(0); - } catch (NullPointerException e) - { - operationLog.info("Could not determine the componentSize of an image. Potentially using non 8-bit image in merging"); - continue; - } - if (componentSize != 8) - { - throw new IllegalArgumentException("Only 8-bit images can be merged."); - } } return createColorMergingAlgorithm(quadratic, saturationEnhancementFactor, isGrayscale, numberOfImages);