From 2f23e09488fc0f3d53d288bfb48fa6ad32d078cd Mon Sep 17 00:00:00 2001
From: jakubs <jakubs>
Date: Tue, 25 Feb 2014 10:07:07 +0000
Subject: [PATCH] BIS-665 SP-1202 make it possible to apply intensity rescale
 filter on more images

SVN: 30595
---
 .../cisd/common/image/IntensityRescaling.java | 29 ++++++++++++++++++-
 1 file changed, 28 insertions(+), 1 deletion(-)

diff --git a/common/source/java/ch/systemsx/cisd/common/image/IntensityRescaling.java b/common/source/java/ch/systemsx/cisd/common/image/IntensityRescaling.java
index 8995eef5d82..8b868385436 100644
--- a/common/source/java/ch/systemsx/cisd/common/image/IntensityRescaling.java
+++ b/common/source/java/ch/systemsx/cisd/common/image/IntensityRescaling.java
@@ -438,7 +438,34 @@ public class IntensityRescaling
      */
     public static BufferedImage rescaleIntensityLevelTo8Bits(BufferedImage image, Levels levels)
     {
-        return rescaleIntensityLevelTo8Bits(new GrayscalePixels(image), levels);
+        final int width = image.getWidth();
+        final int height = image.getHeight();
+        final BufferedImage rescaledImage =
+                new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
+        WritableRaster rescaledRaster = rescaledImage.getRaster();
+
+        final float dynamicRange = 255f / (levels.maxLevel - levels.minLevel);
+
+        for (int y = 0; y < height; ++y)
+        {
+            for (int x = 0; x < width; ++x)
+            {
+                for (Channel channel : Channel.values())
+                {
+                    int originalIntensity = (image.getRGB(x, y) >> channel.getShift()) & 0xff;
+
+                    // cut all intensities above the white point
+                    int intensity = Math.min(levels.maxLevel, originalIntensity);
+                    // cut all intensities below the black point and move the origin to 0
+                    intensity = Math.max(0, intensity - levels.minLevel);
+                    // normalize to [0, 1] and rescale to 8 bits
+                    intensity = (int) (0.5 + (intensity * dynamicRange));
+
+                    rescaledRaster.setSample(x, y, channel.getBand(), intensity);
+                }
+            }
+        }
+        return rescaledImage;
     }
 
     public static BufferedImage rescaleIntensityLevelTo8Bits(BufferedImage image, Levels levels,
-- 
GitLab