У меня есть изображение jpg, которое я конвертирую в данные с помощью функции UIImageJPEGRepresentation

Затем я отправляю данные на сервер онлайн и получаю их обратно, когда это необходимо, хотя я получаю эту строку:

<ffd8ffe0 00104a46 49460001 01000001 00010000 ffe10058 45786966 00004d4d...>

И я не знаю, как преобразовать его обратно в изображение

Заранее спасибо

-1
Hive7 8 Июн 2014 в 17:15

4 ответа

Лучший ответ

Мне удалось найти способ сделать это, преобразовав строку в строку base64 следующим образом:

+ (NSString *) encodeToBase64:(NSData *) rawBytes {
    return [StringMethods encodeToBase64:(const uint8_t*) rawBytes.bytes length:rawBytes.length];
}

+ (NSString *) encodeToBase64:(const uint8_t *)input length:(NSInteger) length {
    NSMutableData *data = [NSMutableData dataWithLength:((length + 2) / 3) * 4];
    uint8_t *output = (uint8_t *)data.mutableBytes;
    for (NSInteger i = 0; i < length; i += 3) {
        NSInteger value = 0;
        for (NSInteger j = i; j < (i + 3); j++) {
            value <<= 8;
            if (j < length) {
                value |= (0xFF & input[j]);
            }
        }

        NSInteger index = (i / 3) * 4;
        output[index + 0] =                    encodingTable[(value >> 18) & 0x3F];
        output[index + 1] =                    encodingTable[(value >> 12) & 0x3F];
        output[index + 2] = (i + 1) < length ? encodingTable[(value >> 6)  & 0x3F] : '=';
        output[index + 3] = (i + 2) < length ? encodingTable[(value >> 0)  & 0x3F] : '=';
    }
    return [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
}

Затем я сохранил его на сервере, а при загрузке обратно использовал эту функцию:

- (NSData *)base64DataFromString: (NSString *)string {
    unsigned long ixtext, lentext;
    unsigned char ch, inbuf[4], outbuf[3];
    short i, ixinbuf;
    Boolean flignore, flendtext = false;
    const unsigned char *tempcstring;
    NSMutableData *theData;
    if (string == nil){
        return [NSData data];
    }
    ixtext = 0;
    tempcstring = (const unsigned char *)[string UTF8String];
    lentext = [string length];
    theData = [NSMutableData dataWithCapacity: lentext];
    ixinbuf = 0;
    while (true) {
        if (ixtext >= lentext) {
            break;
        }
        ch = tempcstring [ixtext++];
        flignore = false;
        if ((ch >= 'A') && (ch <= 'Z')) {
            ch = ch - 'A';
        } else if ((ch >= 'a') && (ch <= 'z')) {
            ch = ch - 'a' + 26;
        } else if ((ch >= '0') && (ch <= '9')) {
            ch = ch - '0' + 52;
        } else if (ch == '+') {
            ch = 62;
        } else if (ch == '=') {
            flendtext = true;
        } else if (ch == '/') {
            ch = 63;
        } else {
            flignore = true;
        }
        if (!flignore) {
            short ctcharsinbuf = 3;
            Boolean flbreak = false;
            if (flendtext) {
                if (ixinbuf == 0) {
                    break;
                }
                if ((ixinbuf == 1) || (ixinbuf == 2)) {
                    ctcharsinbuf = 1;
                } else {
                    ctcharsinbuf = 2;
                }
                ixinbuf = 3;
                flbreak = true;
            }
            inbuf [ixinbuf++] = ch;
            if (ixinbuf == 4) {
                ixinbuf = 0;
                outbuf[0] = (inbuf[0] << 2) | ((inbuf[1] & 0x30) >> 4);
                outbuf[1] = ((inbuf[1] & 0x0F) << 4) | ((inbuf[2] & 0x3C) >> 2);
                outbuf[2] = ((inbuf[2] & 0x03) << 6) | (inbuf[3] & 0x3F);
                for (i = 0; i < ctcharsinbuf; i++) {
                    [theData appendBytes: &outbuf[i] length: 1];
                }
            }
            if (flbreak) {
                break;
            }
        }
    }
    return theData;
}

И, наконец, чтобы преобразовать его в изображение, я воспользовался этим простым методом:

UIImage *image = [UIImage imageWithData:imageData];
1
Hive7 8 Июн 2014 в 16:18

Это то, что вы показываете в виде строки, или это то, что вы получаете при отображении NSData? Я считаю, что если вы регистрируете двоичные данные, все будет так, как вы показали.

Вы показали шестнадцатеричные данные, а не base64, как предлагал другой плакат.

Вы можете написать код, который использует sscanf () для извлечения значений int из шестнадцатеричной строки, или создать объект NSScanner и использовать его метод scanHexInt. Если вы гуглите "конвертировать шестнадцатеричное NSString в целое", вы должны найти оба подхода.

Поскольку между вашими значениями есть пробелы, NSScanner может быть вашим лучшим выбором.

0
Duncan C 8 Июн 2014 в 13:49

Проблема

Вы отправляете NSData на сервер, а не NSString, и поэтому вы получаете этот NSData в том формате, который вы читаете как NSString.

Решение

Сначала вам нужно правильно отправить его как NSString на сервер, выполнив следующие действия:

NSData *imageData= UIImagePNGRepresentation(yourImage);
NSString *encodedString = [imageData base64EncodedStringWithOptions:0];

После того, как вы отправили его в NSString, теперь вы получаете его обратно и управляете им следующим образом. Я использую библиотеку NSData Base64 для выполнения этой задачи.

Вы просто вручную копируете эти файлы в свой проект. Импортируйте классы в свой проект и эти строки в свой код:

#import "NSData+Base64.h"

//This function converts your base64string (NSString Class) to NSData
NSData *data = [[NSData alloc] initWithData:[NSData dataFromBase64String:base64String]];

//Here is where you convert it to UIImage
UIImage *image = [UIImage imageWithData:data];

P.S Вы также можете следить за своим ответом, который мне кажется правильным, но я просто хотел сообщить вам, в чем вы ошиблись.

0
Community 20 Июн 2020 в 09:12

Кажется, это хороший ответ для преобразования:

NSData *dataImage = [[NSData alloc] init];
dataImage = UIImagePNGRepresentation(image);
NSString *stringImage = [dataImage base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];

Который вы можете найти здесь: NSString в UIImage

-1
Community 23 Май 2017 в 10:32