You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xmlgraphics.apache.org by ac...@apache.org on 2008/08/04 11:37:17 UTC

svn commit: r682304 - /xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/ImageEncodingHelper.java

Author: acumiskey
Date: Mon Aug  4 02:37:17 2008
New Revision: 682304

URL: http://svn.apache.org/viewvc?rev=682304&view=rev
Log:
Moved this method to here from the FOP AFPRenderer, added as encodeRGBAsGrayScale().

Modified:
    xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/ImageEncodingHelper.java

Modified: xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/ImageEncodingHelper.java
URL: http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/ImageEncodingHelper.java?rev=682304&r1=682303&r2=682304&view=diff
==============================================================================
--- xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/ImageEncodingHelper.java (original)
+++ xmlgraphics/commons/trunk/src/java/org/apache/xmlgraphics/ps/ImageEncodingHelper.java Mon Aug  4 02:37:17 2008
@@ -5,9 +5,9 @@
  * The ASF licenses this file to You under the Apache License, Version 2.0
  * (the "License"); you may not use this file except in compliance with
  * the License.  You may obtain a copy of the License at
- * 
+ *
  *      http://www.apache.org/licenses/LICENSE-2.0
- * 
+ *
  * Unless required by applicable law or agreed to in writing, software
  * distributed under the License is distributed on an "AS IS" BASIS,
  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
@@ -16,7 +16,7 @@
  */
 
 /* $Id$ */
- 
+
 package org.apache.xmlgraphics.ps;
 
 import java.awt.color.ColorSpace;
@@ -43,11 +43,11 @@
     private static final ColorModel DEFAULT_RGB_COLOR_MODEL = new ComponentColorModel(
             ColorSpace.getInstance(ColorSpace.CS_LINEAR_RGB),
             false, false, ColorModel.OPAQUE, DataBuffer.TYPE_BYTE);
-    
-    private RenderedImage image;
+
+    private final RenderedImage image;
     private ColorModel encodedColorModel;
     private boolean firstTileDump;
-    
+
     /**
      * Main constructor
      * @param image the image
@@ -56,7 +56,7 @@
         this.image = image;
         determineEncodedColorModel();
     }
-    
+
     /**
      * Returns the associated image.
      * @return the image
@@ -64,7 +64,7 @@
     public RenderedImage getImage() {
         return this.image;
     }
-    
+
     /**
      * Returns the native {@link ColorModel} used by the image.
      * @return the native color model
@@ -72,17 +72,17 @@
     public ColorModel getNativeColorModel() {
         return getImage().getColorModel();
     }
-    
+
     /**
      * Returns the effective {@link ColorModel} used to encode the image. If this is different
      * from the value returned by {@link #getNativeColorModel()} this means that the image
-     * is converted in order to encode it because no native encoding is currently possible. 
+     * is converted in order to encode it because no native encoding is currently possible.
      * @return the effective color model
      */
     public ColorModel getEncodedColorModel() {
         return this.encodedColorModel;
     }
-    
+
     /**
      * Indicates whether the image has an alpha channel.
      * @return true if the image has an alpha channel
@@ -90,7 +90,7 @@
     public boolean hasAlpha() {
         return image.getColorModel().hasAlpha();
     }
-    
+
     /**
      * Indicates whether the image is converted during encodation.
      * @return true if the image cannot be encoded in its native format
@@ -98,11 +98,11 @@
     public boolean isConverted() {
         return getNativeColorModel() != getEncodedColorModel();
     }
-    
+
     private void writeRGBTo(OutputStream out) throws IOException {
         encodeRenderedImageAsRGB(image, out);
     }
-    
+
     /**
      * Writes a RenderedImage to an OutputStream by converting it to RGB.
      * @param image the image
@@ -135,7 +135,7 @@
             throw new IllegalArgumentException("Unknown data buffer type: "+
                                                dataType);
         }
-        
+
         ColorModel colorModel = image.getColorModel();
         int w = image.getWidth();
         int h = image.getHeight();
@@ -151,7 +151,73 @@
             out.write(buf);
         }
     }
-    
+
+    /**
+     * Converts a byte array containing 24 bit RGB image data to a grayscale
+     * image.
+     *
+     * @param raw
+     *            the buffer containing the RGB image data
+     * @param width
+     *            the width of the image in pixels
+     * @param height
+     *            the height of the image in pixels
+     * @param bitsPerPixel
+     *            the number of bits to use per pixel
+     * @param out the OutputStream to write the pixels to
+     *
+     * @throws IOException if an I/O error occurs
+     */
+    public static void encodeRGBAsGrayScale(
+            byte[] raw, int width, int height, int bitsPerPixel, OutputStream out)
+    throws IOException {
+        int pixelsPerByte = 8 / bitsPerPixel;
+        int bytewidth = (width / pixelsPerByte);
+        if ((width % pixelsPerByte) != 0) {
+            bytewidth++;
+        }
+
+        //TODO buffer less write more
+        byte[] data = new byte[height * bytewidth];
+        byte ib;
+        for (int y = 0; y < height; y++) {
+            ib = 0;
+            int i = 3 * y * width;
+            for (int x = 0; x < width; x++, i += 3) {
+
+                // see http://www.jguru.com/faq/view.jsp?EID=221919
+                double greyVal = 0.212671d * (raw[i] & 0xff) + 0.715160d
+                        * (raw[i + 1] & 0xff) + 0.072169d
+                        * (raw[i + 2] & 0xff);
+                switch (bitsPerPixel) {
+                case 1:
+                    if (greyVal < 128) {
+                        ib |= (byte) (1 << (7 - (x % 8)));
+                    }
+                    break;
+                case 4:
+                    greyVal /= 16;
+                    ib |= (byte) ((byte) greyVal << ((1 - (x % 2)) * 4));
+                    break;
+                case 8:
+                    ib = (byte) greyVal;
+                    break;
+                default:
+                    throw new UnsupportedOperationException(
+                            "Unsupported bits per pixel: " + bitsPerPixel);
+                }
+
+                if ((x % pixelsPerByte) == (pixelsPerByte - 1)
+                        || ((x + 1) == width)) {
+                    data[(y * bytewidth) + (x / pixelsPerByte)] = ib;
+                    ib = 0;
+                }
+            }
+        }
+        //TODO buffer less write more
+        out.write(data);
+    }
+
     private boolean optimizedWriteTo(OutputStream out)
             throws IOException {
         if (this.firstTileDump) {
@@ -164,7 +230,7 @@
         }
         return false;
     }
-    
+
     /**
      * Indicates whether the image consists of multiple tiles.
      * @return true if there are multiple tiles
@@ -172,9 +238,9 @@
     protected boolean isMultiTile() {
         int tilesX = image.getNumXTiles();
         int tilesY = image.getNumYTiles();
-        return (tilesX != 1 || tilesY != 1); 
+        return (tilesX != 1 || tilesY != 1);
     }
-    
+
     /**
      * Determines the color model used for encoding the image.
      */
@@ -223,7 +289,7 @@
         }
 
     }
-    
+
     /**
      * Encodes the image and writes everything to the given OutputStream.
      * @param out the OutputStream
@@ -237,7 +303,7 @@
         }
         writeRGBTo(out);
     }
-    
+
     /**
      * Encodes the image's alpha channel. If it doesn't have an alpha channel, an
      * {@link IllegalStateException} is thrown.
@@ -260,7 +326,7 @@
 
     /**
      * Writes all pixels (color components only) of a RenderedImage to an OutputStream.
-     * @param image the image to be encoded 
+     * @param image the image to be encoded
      * @param out the OutputStream to write to
      * @throws IOException if an I/O error occurs
      */
@@ -269,7 +335,7 @@
         ImageEncodingHelper helper = new ImageEncodingHelper(image);
         helper.encode(out);
     }
-    
+
     /**
      * Create an ImageEncoder for the given RenderImage instance.
      * @param img the image
@@ -278,18 +344,18 @@
     public static ImageEncoder createRenderedImageEncoder(RenderedImage img) {
         return new RenderedImageEncoder(img);
     }
-    
+
     /**
      * ImageEncoder implementation for RenderedImage instances.
      */
     private static class RenderedImageEncoder implements ImageEncoder {
 
-        private RenderedImage img;
-        
+        private final RenderedImage img;
+
         public RenderedImageEncoder(RenderedImage img) {
             this.img = img;
         }
-        
+
         public void writeTo(OutputStream out) throws IOException {
             ImageEncodingHelper.encodePackedColorComponents(img, out);
         }
@@ -297,7 +363,7 @@
         public String getImplicitFilter() {
             return null; //No implicit filters with RenderedImage instances
         }
-        
+
     }
-    
+
 }



---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: commits-help@xmlgraphics.apache.org