Как использовать код C (libqrencode) в проекте iOS - PullRequest
3 голосов
/ 28 сентября 2011

Я начал программировать около года назад на iOS и начал писать Objective C, и мне удалось создать несколько приложений. Я посещаю свой первый хакерский день на следующей неделе и придумала идею квази-сокровищ, которая включает QR-коды. Мне удалось найти классы ObjC для обработки декодирования QR-кода, но, во-первых, не было ничего, что могло бы их кодировать / генерировать.

Я нашел ссылки на несколько объективных C-фреймворков на git hub, но у всех, похоже, остались нерешенные проблемы. Тогда я нашел эту тему здесь:

Есть ли какая-либо библиотека кодирования QR в Какао?

Это указало мне на направление libqrencode C 'библиотеки', которую я мог бы заставить работать в iOS, будучи надмножеством C.

К сожалению, у меня нет формальных знаний в области компьютерных наук. Я не знаю, с чего начать становиться доступным в моем проекте. Может кто-нибудь объяснить основные шаги, что мне нужно сделать, чтобы я мог, по крайней мере, разумно Google.

До сих пор я читал об установлении путей поиска и создании статических библиотек, но не представляю, является ли это даже правильным путем.

Любая помощь приветствуется - постарайтесь быть проще: мои знания заканчиваются на написании основных ВК.

Ответы [ 5 ]

3 голосов
/ 20 июля 2012

Вот блог от парня, который создал рабочий проект XCode с включенной библиотекой и пример кода. Пример кода тот же, что @conradev опубликовал в качестве одного из ответов. Я проверил это в Xcode 4.3 и прекрасно работает.

Я попытался включить исходную библиотеку в один из моих проектов и потерпел неудачу, но затем я включил их в этот проект, и все это работало без каких-либо настроек, так что я уверен, что он не изменил никаких настроек в проекте Xcode. Просто создайте новый проект, перетащите в него файлы lib qrencode из этого проекта, вставьте код @ conradev, и все будет работать как положено.

1 голос
/ 06 ноября 2011

libqrencode распространяется по лицензии LGPL.Чтобы ваш код оставался закрытым, он должен ссылаться на libqrencode таким образом, чтобы пользователь мог заменить библиотеку модифицированной версией (1) .Это невозможно сделать в App Store.Для использования libqrencode ваш код должен быть лицензирован по лицензии GPL, а код, лицензированный по лицензии GPL, не разрешен в App Store (2) .Поэтому вы не можете использовать libqrencode в приложении App Store.

Тем не менее, здесь приведен код, который можно использовать в проекте iOS для взаимодействия с libqrencode:

#import <libqrencode/qrencode.h>

void freeRawData(void *info, const void *data, size_t size) {
    free((unsigned char *)data);
}

- (UIImage *)quickResponseImageForString:(NSString *)dataString withDimension:(int)imageWidth {

    QRcode *resultCode = QRcode_encodeString([dataString UTF8String], 0, QR_ECLEVEL_L, QR_MODE_8, 1);

    unsigned char *pixels = (*resultCode).data;
    int width = (*resultCode).width;
    int len = width * width;

    if (imageWidth < width)
        imageWidth = width;

    // Set bit-fiddling variables
    int bytesPerPixel = 4;
    int bitsPerPixel = 8 * bytesPerPixel;
    int bytesPerLine = bytesPerPixel * imageWidth;
    int rawDataSize = bytesPerLine * imageWidth;

    int pixelPerDot = imageWidth / width;
    int offset = (int)((imageWidth - pixelPerDot * width) / 2);

    // Allocate raw image buffer
    unsigned char *rawData = (unsigned char*)malloc(rawDataSize);
    memset(rawData, 0xFF, rawDataSize);

    // Fill raw image buffer with image data from QR code matrix
    int i;
    for (i = 0; i < len; i++) {
        char intensity = (pixels[i] & 1) ? 0 : 0xFF;

        int y = i / width;
        int x = i - (y * width);

        int startX = pixelPerDot * x * bytesPerPixel + (bytesPerPixel * offset);
        int startY = pixelPerDot * y + offset;
        int endX = startX + pixelPerDot * bytesPerPixel;
        int endY = startY + pixelPerDot;

        int my;
        for (my = startY; my < endY; my++) {
            int mx;
            for (mx = startX; mx < endX; mx += bytesPerPixel) {
                rawData[bytesPerLine * my + mx    ] = intensity;    //red
                rawData[bytesPerLine * my + mx + 1] = intensity;    //green
                rawData[bytesPerLine * my + mx + 2] = intensity;    //blue
                rawData[bytesPerLine * my + mx + 3] = 255;          //alpha
            }
        }
    }

    CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, rawData, rawDataSize, (CGDataProviderReleaseDataCallback)&freeRawData);
    CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();
    CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;
    CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;
    CGImageRef imageRef = CGImageCreate(imageWidth, imageWidth, 8, bitsPerPixel, bytesPerLine, colorSpaceRef, bitmapInfo, provider, NULL, NO, renderingIntent);

    UIImage *quickResponseImage = [UIImage imageWithCGImage:imageRef];

    CGImageRelease(imageRef);
    CGColorSpaceRelease(colorSpaceRef);
    CGDataProviderRelease(provider);
    QRcode_free(resultCode);

    return quickResponseImage;
}
1 голос
/ 22 октября 2011

Взгляните на этот libqrencode xcode project . Это только дает вам скомпилированную библиотеку, но без примера использования.

1 голос
/ 22 октября 2011

Вот что вам нужно сделать для любой статической библиотеки C:

  1. включить библиотеку в проект XCode, перейти в проект, затем выбрать вкладку «фазы сборки» и там открытьраздел «связать двоичные файлы с библиотеками» - добавьте туда свою статическую библиотеку libqrencode для компиляции.
  2. Перейдите на вкладку «Настройки сборки» проекта и найдите «заголовок», затем добавьте путь к месту библиотекифайлы заголовков хранятся в «путях поиска заголовков».

Теперь вы можете включать файлы заголовков в файлы Objective-C и вызывать их напрямую в библиотеку.

Общая начальная точка поиска Googleбудет "добавить библиотеку C в проект iPhone XCode".Это не совсем навык CS, CS более эзотеричен, чем пути поиска ...

1 голос
/ 11 октября 2011

Я бы порекомендовал QR-кодер Objective C , который представляет собой лицензированный Apache QR-кодер, написанный в объективе C.

...