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

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

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

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

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

-1
Hive7 8 Июн 2014 в 17:15
Предположительно, это данные изображения в объекте NSData. Вам нужно знать (примерно), как он закодирован, и отправить его в соответствующий декодер.
 – 
Hot Licks
8 Июн 2014 в 18:04
(Что вы хотите? Чтобы передать данные в другой ящик? Отобразить данные в виде изображения на этом ящике?
 – 
Hot Licks
8 Июн 2014 в 18:06
Это данные из изображения jpg, какой декодер я бы использовал
 – 
Hive7
8 Июн 2014 в 18:22
Пожалуйста, вернитесь и отредактируйте свой вопрос, чтобы четко описать, что вы хотите.
 – 
Hot Licks
8 Июн 2014 в 18:26
Вот вы идете
 – 
Hive7
8 Июн 2014 в 18:29

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 в 20:18

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

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

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

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

0
Duncan C 8 Июн 2014 в 17:49
Я отправляю то, что сказал выше, в базу данных, а затем, когда я получаю это обратно, я получаю это, как указано выше, хотя и в виде строки.
 – 
Hive7
8 Июн 2014 в 17:55
Если вы помещаете данные в базу данных, вы должны записывать/читать их как «BLOB», начиная/заканчивая объектами NSData. Тогда данные не будут повреждены при переходах.
 – 
Hot Licks
8 Июн 2014 в 18:24
(Если вы не используете большой двоичный объект, вы должны преобразовать данные в Base64 и обратно.)
 – 
Hot Licks
8 Июн 2014 в 18:25
Горячие Лики, это чепуха. Вы можете передавать данные с помощью азбуки Морзе, если хотите. Шестнадцатеричная кодировка не так эффективна, как Base64, но она работает. Как упоминалось в моем посте, NSScanner будет отделять целые числа от данных, которые вы затем сохраните «по байтам» в свои NSData.
 – 
Duncan C
8 Июн 2014 в 18:31
Я не говорю о передаче, я говорю о вставке данных в базу данных.
 – 
Hot Licks
8 Июн 2014 в 18:37

Проблема

Вы отправляете 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 в 12:12

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

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

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

-1
Community 23 Май 2017 в 13:32
Извините, возможно, я неправильно выразился. Я могу получать данные изображения на веб-сервер и с него, хотя теперь я не могу преобразовать данные в виде строки в изображение.
 – 
Hive7
8 Июн 2014 в 17:42
На самом деле это не сработает, так как я не могу преобразовать строку в данные, потому что она изменяет @AlessandroDiaferia
 – 
Hive7
8 Июн 2014 в 17:46