Issue 494 round luminance values rather than truncate
[zxing.git] / javase / src / com / google / zxing / client / j2se / BufferedImageLuminanceSource.java
index d9e61a3..28b0129 100644 (file)
@@ -18,9 +18,8 @@ package com.google.zxing.client.j2se;
 
 import com.google.zxing.LuminanceSource;
 
+import java.awt.Graphics2D;
 import java.awt.image.BufferedImage;
-import java.awt.image.BufferedImageOp;
-import java.awt.image.AffineTransformOp;
 import java.awt.geom.AffineTransform;
 
 /**
@@ -96,7 +95,8 @@ public final class BufferedImageLuminanceSource extends LuminanceSource {
         int pixel = rgb[offset + x];
         int luminance = (306 * ((pixel >> 16) & 0xFF) +
             601 * ((pixel >> 8) & 0xFF) +
-            117 * (pixel & 0xFF)) >> 10;
+            117 * (pixel & 0xFF) +
+            (0x200)) >> 10; // 0x200 = 1<<9, half an lsb of the result to force rounding
         matrix[offset + x] = (byte) luminance;
       }
     }
@@ -110,7 +110,7 @@ public final class BufferedImageLuminanceSource extends LuminanceSource {
 
   @Override
   public LuminanceSource crop(int left, int top, int width, int height) {
-    return new BufferedImageLuminanceSource(image, left, top, width, height);
+    return new BufferedImageLuminanceSource(image, this.left + left, this.top + top, width, height);
   }
 
   // Can't run AffineTransforms on images of unknown format.
@@ -129,11 +129,14 @@ public final class BufferedImageLuminanceSource extends LuminanceSource {
 
     // Rotate 90 degrees counterclockwise.
     AffineTransform transform = new AffineTransform(0.0, -1.0, 1.0, 0.0, 0.0, sourceWidth);
-    BufferedImageOp op = new AffineTransformOp(transform, AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
 
     // Note width/height are flipped since we are rotating 90 degrees.
     BufferedImage rotatedImage = new BufferedImage(sourceHeight, sourceWidth, image.getType());
-    op.filter(image, rotatedImage);
+
+    // Draw the original image into rotated, via transformation
+    Graphics2D g = rotatedImage.createGraphics();
+    g.drawImage(image, transform, null);
+    g.dispose();
 
     // Maintain the cropped region, but rotate it too.
     int width = getWidth();