У меня есть изображение jpg, которое я конвертирую в данные с помощью функции UIImageJPEGRepresentation
Затем я отправляю данные на сервер онлайн и получаю их обратно, когда это необходимо, хотя я получаю эту строку:
<ffd8ffe0 00104a46 49460001 01000001 00010000 ffe10058 45786966 00004d4d...>
И я не знаю, как преобразовать его обратно в изображение
Заранее спасибо
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];
Это то, что вы показываете в виде строки, или это то, что вы получаете при отображении NSData? Я считаю, что если вы регистрируете двоичные данные, все будет так, как вы показали.
Вы показали шестнадцатеричные данные, а не base64, как предлагал другой плакат.
Вы можете написать код, который использует sscanf () для извлечения значений int из шестнадцатеричной строки, или создать объект NSScanner и использовать его метод scanHexInt. Если вы гуглите "конвертировать шестнадцатеричное NSString в целое", вы должны найти оба подхода.
Поскольку между вашими значениями есть пробелы, NSScanner может быть вашим лучшим выбором.
Проблема
Вы отправляете 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 Вы также можете следить за своим ответом, который мне кажется правильным, но я просто хотел сообщить вам, в чем вы ошиблись.
Кажется, это хороший ответ для преобразования:
NSData *dataImage = [[NSData alloc] init];
dataImage = UIImagePNGRepresentation(image);
NSString *stringImage = [dataImage base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
Который вы можете найти здесь: NSString в UIImage
Похожие вопросы
Связанные вопросы
Новые вопросы
ios
iOS - мобильная операционная система, работающая на Apple iPhone, iPod touch и iPad. Используйте этот тег [ios] для вопросов, связанных с программированием на платформе iOS. Используйте связанные теги [target-c] и [swift] для проблем, характерных для этих языков программирования.