More encoding related changes for encoding Chinese chars in QR codes
[zxing.git] / jruby / lib / zxing.rb
1 raise "ZXing requires JRuby" unless defined?(JRuby)
2
3 require File.expand_path( File.dirname(__FILE__) + '/core.jar' )    # ZXing core classes
4 require File.expand_path( File.dirname(__FILE__) + '/javase.jar' )  # ZXing JavaSE classes
5
6 require 'uri'
7
8 # Google ZXing classes
9 java_import com.google.zxing.MultiFormatReader
10 java_import com.google.zxing.BinaryBitmap
11 java_import com.google.zxing.Binarizer
12 java_import com.google.zxing.common.GlobalHistogramBinarizer
13 java_import com.google.zxing.LuminanceSource
14 java_import com.google.zxing.client.j2se.BufferedImageLuminanceSource
15
16 # Standard Java classes
17 java_import javax.imageio.ImageIO
18 java_import java.net.URL
19
20 module ZXing
21
22   @@decoder = MultiFormatReader.new
23
24   # Transform the module into a singleton!
25   extend self
26
27   def decode(descriptor)
28     begin
29       decode!(descriptor)
30     rescue NativeException
31       return nil
32     end
33   end
34
35   def decode!(descriptor)
36     descriptor = descriptor.path if descriptor.respond_to? :path
37     descriptor = descriptor.to_s
38     descriptor = case descriptor
39     when URI.regexp(['http', 'https'])
40       URL.new(descriptor)
41     else
42       Java::JavaIO::File.new(descriptor)
43     end
44     image = ImageIO.read(descriptor)
45     bitmap = to_bitmap(image)
46     @@decoder.decode(bitmap).to_s
47   end
48
49   private
50
51   def to_bitmap(image)
52     luminance = BufferedImageLuminanceSource.new(image)
53     binarizer = GlobalHistogramBinarizer.new(luminance)
54     BinaryBitmap.new(binarizer)
55   end
56 end