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 8995eef5d8269bd6a0dc74873ea11ce7b9bc0ab9..8b868385436490efef52472e46279dcc3ca56ae4 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,