Index: src/java/org/apache/xmlgraphics/ps/ImageEncodingHelper.java
===================================================================
--- src/java/org/apache/xmlgraphics/ps/ImageEncodingHelper.java	(revision 1488271)
+++ src/java/org/apache/xmlgraphics/ps/ImageEncodingHelper.java	(working copy)
@@ -51,6 +51,8 @@
     private boolean firstTileDump;
     private boolean enableCMYK;
     private boolean isBGR;
+    private boolean outputbw;
+    private boolean bwinvert;
 
     /**
      * Main constructor
@@ -58,6 +60,7 @@
      */
     public ImageEncodingHelper(RenderedImage image) {
         this(image, false);
+        outputbw = true;
     }
 
     /**
@@ -118,16 +121,21 @@
         if (encoded) {
             return;
         }
-        encodeRenderedImageAsRGB(image, out);
+        encodeRenderedImageAsRGB(image, out, outputbw, bwinvert);
     }
 
+    public static void encodeRenderedImageAsRGB(RenderedImage image, OutputStream out)
+            throws IOException {
+        encodeRenderedImageAsRGB(image, out, false, false);
+    }
+
     /**
      * Writes a RenderedImage to an OutputStream by converting it to RGB.
      * @param image the image
      * @param out the OutputStream to write the pixels to
      * @throws IOException if an I/O error occurs
      */
-    public static void encodeRenderedImageAsRGB(RenderedImage image, OutputStream out)
+    public static void encodeRenderedImageAsRGB(RenderedImage image, OutputStream out, boolean outputbw, boolean bwinvert)
                 throws IOException {
         Raster raster = getRaster(image);
         Object data;
@@ -138,7 +146,7 @@
             data = new byte[nbands];
             break;
         case DataBuffer.TYPE_USHORT:
-            data = new short[nbands];
+            data = null;
             break;
         case DataBuffer.TYPE_INT:
             data = new int[nbands];
@@ -157,13 +165,23 @@
         int w = image.getWidth();
         int h = image.getHeight();
 
-        byte[] buf = new byte[w * 3];
+        int numDataElements = raster.getNumDataElements();
+        if (numDataElements > 1 || !outputbw) {
+            numDataElements = 3;
+        }
+
+        byte[] buf = new byte[w * numDataElements];
+
         for (int y = 0; y < h; y++) {
             int idx = -1;
             for (int x = 0; x < w; x++) {
                 int rgb = colorModel.getRGB(raster.getDataElements(x, y, data));
-                buf[++idx] = (byte)(rgb >> 16);
-                buf[++idx] = (byte)(rgb >> 8);
+                if (numDataElements > 1) {
+                    buf[++idx] = (byte)(rgb >> 16);
+                    buf[++idx] = (byte)(rgb >> 8);
+                } else if (bwinvert && rgb == -1) {
+                    rgb = 1;
+                }
                 buf[++idx] = (byte)(rgb);
             }
             out.write(buf);
@@ -438,7 +456,7 @@
      */
     public static void encodePackedColorComponents(RenderedImage image, OutputStream out)
                 throws IOException {
-        ImageEncodingHelper helper = new ImageEncodingHelper(image, true);
+        ImageEncodingHelper helper = new ImageEncodingHelper(image);
         helper.encode(out);
     }
 
@@ -469,7 +487,9 @@
         public String getImplicitFilter() {
             return null; //No implicit filters with RenderedImage instances
         }
+    }
 
+    public void setBWInvert(boolean v) {
+        bwinvert = v;
     }
-
 }
Index: src/java/org/apache/xmlgraphics/ps/PSImageUtils.java
===================================================================
--- src/java/org/apache/xmlgraphics/ps/PSImageUtils.java	(revision 1488271)
+++ src/java/org/apache/xmlgraphics/ps/PSImageUtils.java	(working copy)
@@ -25,6 +25,7 @@
 import java.awt.geom.Rectangle2D;
 import java.awt.image.ColorModel;
 import java.awt.image.DataBuffer;
+import java.awt.image.DataBufferByte;
 import java.awt.image.IndexColorModel;
 import java.awt.image.Raster;
 import java.awt.image.RenderedImage;
@@ -141,6 +142,11 @@
         gen.restoreGraphicsState();
     }
 
+    public static void writeImage(ImageEncoder encoder, Dimension imgDim, String imgDescription,
+                                  Rectangle2D targetRect, ColorModel colorModel, PSGenerator gen) throws IOException {
+        writeImage(encoder, imgDim, imgDescription, targetRect, colorModel, gen, null);
+    }
+
     /**
      * Writes a bitmap image to the PostScript stream.
      * @param encoder the image encoder
@@ -152,7 +158,7 @@
      * @throws IOException In case of an I/O exception
      */
     public static void writeImage(ImageEncoder encoder, Dimension imgDim, String imgDescription,
-            Rectangle2D targetRect, ColorModel colorModel, PSGenerator gen)
+            Rectangle2D targetRect, ColorModel colorModel, PSGenerator gen, RenderedImage ri)
             throws IOException {
 
         gen.saveGraphicsState();
@@ -178,6 +184,13 @@
         imageDict.put("/DataSource", "Data");
 
         populateImageDictionary(imgDim, colorModel, imageDict);
+
+        if (ri != null) {
+            DataBuffer buffer = ri.getData().getDataBuffer();
+            if (!(buffer instanceof DataBufferByte)) {
+                imageDict.put("/BitsPerComponent", 8);
+            }
+        }
         writeImageCommand(imageDict, colorModel, gen);
 
         /*
@@ -351,7 +364,7 @@
         ImageEncodingHelper helper = new ImageEncodingHelper(img);
         ColorModel cm = helper.getEncodedColorModel();
 
-        writeImage(encoder, imgDim, imgDescription, targetRect, cm, gen);
+        writeImage(encoder, imgDim, imgDescription, targetRect, cm, gen, img);
     }
 
     /**
Index: test/java/org/apache/xmlgraphics/ps/ImageEncodingHelperTestCase.java
===================================================================
--- test/java/org/apache/xmlgraphics/ps/ImageEncodingHelperTestCase.java	(revision 1488271)
+++ test/java/org/apache/xmlgraphics/ps/ImageEncodingHelperTestCase.java	(working copy)
@@ -97,8 +97,8 @@
         BufferedImage imageRGB = new BufferedImage(100, 75, BufferedImage.TYPE_INT_BGR);
         imageRGB = prepareImage(imageRGB);
 
-        ImageEncodingHelper imageEncodingHelperBGR = new ImageEncodingHelper(imageBGR);
-        ImageEncodingHelper imageEncodingHelperRGB = new ImageEncodingHelper(imageRGB);
+        ImageEncodingHelper imageEncodingHelperBGR = new ImageEncodingHelper(imageBGR, false);
+        ImageEncodingHelper imageEncodingHelperRGB = new ImageEncodingHelper(imageRGB, false);
 
         ByteArrayOutputStream baosBGR = new ByteArrayOutputStream();
         imageEncodingHelperBGR.encode(baosBGR);
