QR codes are a sort of two-dimensional
barcodes. It's quite much a de-facto standard for mobiles in Japan and is gaining in popularity world-wide. Some people incorrectly assume that "QR codes" and "2D barcodes" are synonyms, however there're dozens of 2D barcode formats/standards and QR code is just one of them (check out the
Wikipedia page for an extensive list of 2D barcode formats). QR codes can hold all sorts of content, not just numbers, text or URLs (which is the most common use of QR codes). They can hold up to 2953 bytes so small icons, images are also embeddable.
I've tested the built-in barcode reader of my Nokia N95 8GB: it could read successfully only the standard QR codes and failed to read any of the crippled ones in the
Wikipedia article (those that got some data removed, but should be still decodable due to the Read-Solomon coding used in QR codes). I could not read the one with the
face design either. It seems I'll have to look for a better barcode reader.
Here're some articles/websites on 2D barcodes (mostly related to mobile application):
Some barcode generators:
And some barcode readers for mobiles:
Since Glass is told not to support the N95, I did not even bother trying it. I've tested the other four apps though using the test QR codes that are available on the
Wikipedia page.
Here're my results:
- Nokia's Barcode Reader: quite nice, but it could read only the source image. Supports more 2D barcode formats (not sure which ones) and thus it's a bit slow in recognition.
- Kaywa Reader: fast and this was the only one that could read one of the non-standard images, namely the one with the face design.
- UpCode: fast and this is the only one that can read "regular" 1D barcodes too, but in 2D it could read only the source image.
- Semacode: this one is quite poor. It's written in Java and I suppose that's the reason for it not being able to continuously capture and analyze the image of the camera (like all the other barcode readers do). You can only position the camera and select "Capture". Then the phone asks you (every time) whether you allow the Semacode app. to use your camera and if you select "yes", then (and only then) it takes a shot and analyzes it. I could not read any single QR code using this app, but that's probably my mistake. However this annoying thing with asking for Java permission makes it quite a pain to use.
- QuickMark: good error correction, but still did not manage to recognize any of the "damaged" barcodes. Did not even recognize the face design code.
It was interesting to see that the i-nigma reader has the same settings and behaviour (while having its own look due to customized background image, fonts, etc.) and decoding capabilities as the Kaywa reader.

And the i-nigma reader could decode the face design QR code too! All these similiarities cannot be coincidental. After a little Google search it turned out that both use the reader (or the SDK) of
3GVision. Actually i-nigma.com belongs to 3GVision.
Surprisingly none of the readers could decode any part of the "damaged" QR codes (
this and
this).
Imho the best QR code reader is Kaywa (since it's the only one in my test that could read something that the others could not) and the most versatile (supporting 1D barcodes too) is UpCode.
PS: I've replaced the default Drupal logo on my site with a QR code.

It's quite interesting that non of the barcode reader apps could decode my QR code with default settings (except for QuickMark, but it had "close up" focusing as default).

I assume that the gradient background behind the logo is responsible for this, because if I load only the logo image in Firefox, then all readers managed to decode. However on the page (with the gradient background) the Nokia Barcode Reader failed completely, the Kaywa Reader could decode it once I've set the "scan mode" from normal to "close up", and UpCode succeeded once I've set the zoom level to 30%. So if you've problems reading a barcode, play with these settings to improve the chances of success. Another interesting thing is that Nokia Barcode Reader and Kaywa Reader both managed to display the latin1 "ü" character as it was meant (I created the QR code with
Nokia's barcode generator so I've no idea about the encoding used), but UpCode displayed this char as the string "ü".
PS2: it's not quite trivial ... UpCode does no autodetection on the barcode format. You've to select the format that is to be recognized manually and the default format is DataMatrix (DM). UpCode can read 1D barcodes, but supports only the UPC-A, UPC-E, EAN/JAN-8 and EAN/JAN-13 variants. These are used for most products in stores, but you cannot read eg. the
Wikipedia barcode, because it's encoded with Code 128.

Nobody's perfect.
Comments
Scanlife
QR code programming
Google Android's barcode reader
It appears that barcode decoding is not yet perfect. The command line version could decode only the original Wikipedia QR code example and none of the others (including the "damaged" QR codes, the face design code and the QR code of my website). It failed to decode the Code 128 and Code 93 examples from the Wikipedia barcode page as well. Scaling up the images helped somewhat, this way it could decode the Code 128 Wikipedia barcode and the QR code of my site too. However I could not make it to decode the Code 93 Wikipedia example (
despite that according to the ZXing project page it supports Code 93 barcodes- update: it was my mistake ... ZXing supports Code 39 and not Code 93) and the face design QR code (which was successfully decoded by the Kaywa reader previously). Btw.The JavaME application has other issues too. First of all, it's a Java app and as such, it asks for permission whenever it tries to access the camera. The other problem is that for some reason I see only the upper half of the camera image on the N95's display, there's no menu, help or instructions of any sort. So in this form it's pretty much unusable ... it's more like a proof of concept.
But I'm confident that this app will grow up and meet my expectations.
PS: there's an Interesting Links page on the project page of ZXing full of useful staff regarding barcode reading.
PS2: I've tested ZXing's 1D-barcode reading capabilities using barcodes from barcoding.com.
PS3: I've revisited ZXing (the JavaME version that is available at the moment - ie. on 27th June 2009), but the JavaME version was not able to decode the QR code of my site. However it was able to decode the Wikipedia QR code. I've done the test of these two with the very same resolution of images, same display (using Xee on my Mac with a black background), so I assume that the JavaME ZXing had a problem with contents of my QR code. The Wikipedia QR code contains only a web address, while mine contains my nickname, my website's address and my email address (all separated by commas). So there's still a way to go for ZXing. On their GetTheReader page they clearly state that only the Android and iPhone versions are actively developed and tested so it's no wonder that the JavaME version does not excel.
In reply to the comment
Re: In reply to the comment
Re: Google Android's barcode reader (ZXing)
P.S.: after having scanned a hundred or so barcodes I've finally found one that ZXing couldn't read.
Making barcode reading easier
Here's the JS code if somebody's interested:
$(document).ready(function() {
$('#logo').hover(function() {
var $img = $('<img id="logoMagnified">');
var img = $img.get(0);
var scale = 3;
$img.load(function() {
var img = $(this).get(0);
img.width = img.width * scale;
img.height = img.height * scale;
$(document.body).append($(this).hide());
$(this).css({
position: 'absolute',
border: '10px solid #ffffff',
right: '50%',
bottom: '50%',
marginBottom: Math.round(img.height / -2) + 'px',
marginRight: Math.round(img.width / -2) + 'px',
zIndex: 30000
}).fadeIn('fast');
});
img.src = this.src;
}, function() {
$('#logoMagnified').fadeOut('fast', function() {
$(this).remove();
});
});
});
Update: on the 19" LCD (with the resolution set to 1024x768) at my office I could decode the QR code with all the readers I've tested (the Nokia, the Kaywa and the UpCode). It seems that barcode reading from the screen pretty much depends on the screen size and the resolution ... which is trivial of course, it's just I didn't expect any problems with a QR code of the size of a smaller stamp. Obviously reading from the screen requires a bit larger QR code than reading from a printed stuff (like paper or clothing).
I use quickmark for