Various barcode reader free SDK in iOS

xrnd picture xrnd · Apr 3, 2013 · Viewed 7.3k times · Source

I am making a barcode reader app which is free. I am looking for free SDK to decode Datamatrix,QR,Aztec,UPC,EAN barcodes. I have implemented ZBar SDK as per now. Which detects QR,UPC and EAN successfully. I tested This link

Zbar

ZXingOBjC

But none of these are able to detect Aztec properly. With Data Matrix,UPC,EAN and QR i found Redlaser very effective but now its not free.

Now, is there any free SDK available to detect all four barcodes without paying as i want to keep my app free on app store.

Please suggest

P.S I want compatibility of scanner with latest iOS available.

Answer

Edwin Vermeer picture Edwin Vermeer · Apr 3, 2013

With some work you could do this using zint. See https://github.com/samlown/zint/blob/master/backend/aztec.c I have used this in an app. Sorry, I am not allowed to share more code than this: include the barcode, aztec, common, font, gs1, rs and bmp classes Then put the code below in a seperate class

void dataProviderReleased (void *info, const void *data, size_t size) {
    struct barcode_symbol *my_symbol = info;
    Barcode_Delete(my_symbol);
}

+ (UIImage *)aztecBarcodeImageFromString:(NSString *)s scale:(CGFloat)scale {
    UIImage *image = nil;
    int errorCode = 0;
    struct barcode_symbol *my_symbol;

    if (s == nil) {
        return nil;
    }

    unsigned char *unicodeCharPtr = (unsigned char *)[s cStringUsingEncoding:NSUTF8StringEncoding];

    LogInfo(@"Creating barcode image for string: %@", s);

    my_symbol = Barcode_Create();

    my_symbol->output_options = 0;

    //my_symbol->output_options = BARCODE_BOX; //For a box around the bar code
    my_symbol->scale = scale;
    my_symbol->symbology = BARCODE_AZTEC;

    my_symbol->input_mode = UNICODE_MODE;

    errorCode = Barcode_Encode(my_symbol, unicodeCharPtr, 0);

    if (errorCode == 0) {
        errorCode = Barcode_Buffer(my_symbol, 0);

        if (errorCode == 0) {

            int numberOfComponents = 3;
            long imgSizePerRow = numberOfComponents * my_symbol->bitmap_width;
            long imgSize = imgSizePerRow * my_symbol->bitmap_height;

            CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();

            //The dataProviderReleased method is responsible for deallocating the ZBarCode with the corresponding image data
            CGDataProviderRef providerRef = CGDataProviderCreateWithData(my_symbol, my_symbol->bitmap, imgSize, dataProviderReleased);

            CGImageRef imageRef = CGImageCreate(my_symbol->bitmap_width, my_symbol->bitmap_height, 8, numberOfComponents * 8, 
                                                imgSizePerRow, colorSpace, kCGBitmapByteOrderDefault | kCGImageAlphaNone, 
                                                providerRef, NULL, NO, kCGRenderingIntentDefault);

            image = [UIImage imageWithCGImage:imageRef];

            CGColorSpaceRelease(colorSpace);
            CGDataProviderRelease(providerRef);
            CGImageRelease(imageRef);
        } else {
            LogWarn(@"Could not buffer barcode, error=%d", errorCode);
            Barcode_Delete(my_symbol);
        }

    } else {
        LogWarn(@"Could not encode barcode, error=%d", errorCode);
        Barcode_Delete(my_symbol);
    }

    return image;
}