кодировать изображение в base64, получить недопустимую строку base64 (ios использует base64EncodedStringWithOptions)

Вот мой код.

  UIImage *img = [UIImage imageNamed:@"white.jpeg"];
  NSData *imageData = UIImagePNGRepresentation(img);
  NSString *imageString = [imageData base64EncodedStringWithOptions:0];
  NSLog(@"%@", imageString);

И я всегда получаю недопустимую строку base64, содержащую пробел.

iVBORw0KGgoAAAANSUhEUgAAARMAAAC3CAIAAAC MS2jAAAAHGlET1QAAAACAAAAAAAAAFwAAAAoAAAAXAAAAFsAAAMC oRdmgAAAs5JREFUeAHs1tFKI1EABFH//5NNVh02uA LQhwoCZ0zj5LbTlffInl58yCAwM8JvPz8iBMIIPDGHJcAgTMEmHOGmjMIMMcdQOAMAeacoeYMAsxxBxA4Q4A5Z6g5gwBz3IGHIPD zfMQL/fVSzDnKyr 9usEvhHn/ddf5N5/yJx7SflcSoA5KV7hz0Lgn0gPW9h3zsNO81wvdr1e/3w R3PmPNf82p4mcLlcDnlu/txCbvKcDqwP s6pCcu/i8Bhzn/yMOcucD705ARe/z43eY5fbQcN5jz5lVB/k4Bfa5u7alUTYE5NWP4mAeZs7qpVTYA5NWH5mwSYs7mrVjUB5tSE5W8SYM7mrlrVBJhTE5a/SYA5m7tqVRNgTk1Y/iYB5mzuqlVNgDk1YfmbBJizuatWNQHm1ITlbxJgzuauWtUEmFMTlr9JgDmbu2pVE2BOTVj JgHmbO6qVU2AOTVh ZsEmLO5q1Y1AebUhOVvEmDO5q5a1QSYUxOWv0mAOZu7alUTYE5NWP4mAeZs7qpVTYA5NWH5mwSYs7mrVjUB5tSE5W8SYM7mrlrVBJhTE5a/SYA5m7tqVRNgTk1Y/iYB5mzuqlVNgDk1YfmbBJizuatWNQHm1ITlbxJgzuauWtUEmFMTlr9JgDmbu2pVE2BOTVj JgHmbO6qVU2AOTVh ZsEmLO5q1Y1AebUhOVvEmDO5q5a1QSYUxOWv0mAOZu7alUTYE5NWP4mAeZs7qpVTYA5NWH5mwSYs7mrVjUB5tSE5W8SYM7mrlrVBJhTE5a/SYA5m7tqVRNgTk1Y/iYB5mzuqlVNgDk1YfmbBJizuatWNQHm1ITlbxJgzuauWtUEmFMTlr9JgDmbu2pVE2BOTVj JgHmbO6qVU2AOTVh ZsEmLO5q1Y1AebUhOVvEmDO5q5a1QSYUxOWv0mAOZu7alUTYE5NWP4mAeZs7qpVTeADAAD//66TqMcAAAIISURBVO3TsQ0AAAjDMP4/GnEDmc3exSKzjgCBv8D8JxYECKxyPAGBIqCcomZDQDl gEARUE5RsyGgHD9AoAgop6jZEFCOHyBQBJRT1GwIKMcPECgCyilqNgSU4wcIFAHlFDUbAsrxAwSKgHKKmg0B5fgBAkVAOUXNhoBy/ACBIqCcomZDQDl gEARUE5RsyGgHD9AoAgop6jZEFCOHyBQBJRT1GwIKMcPECgCyilqNgSU4wcIFAHlFDUbAsrxAwSKgHKKmg0B5fgBAkVAOUXNhoBy/ACBIqCcomZDQDl gEARUE5RsyGgHD9AoAgop6jZEFCOHyBQBJRT1GwIKMcPECgCyilqNgSU4wcIFAHlFDUbAsrxAwSKgHKKmg0B5fgBAkVAOUXNhoBy/ACBIqCcomZDQDl gEARUE5RsyGgHD9AoAgop6jZEFCOHyBQBJRT1GwIKMcPECgCyilqNgSU4wcIFAHlFDUbAsrxAwSKgHKKmg0B5fgBAkVAOUXNhoBy/ACBIqCcomZDQDl gEARUE5RsyGgHD9AoAgop6jZEFCOHyBQBJRT1GwIKMcPECgCyilqNgSU4wcIFAHlFDUbAsrxAwSKgHKKmg0B5fgBAkVAOUXNhoBy/ACBIqCcomZDQDl gEARUE5RsyGgHD9AoAgop6jZEFCOHyBQBJRT1GwIKMcPECgCB/GnRcSfso/fAAAAAElFTkSuQmCC

Так растерялся.

Когда я пытаюсь удалить пробел в строке base64 и декодировать его.

Я не могу получить исходное изображение.


person Yu-Shing Shen    schedule 07.03.2014    source источник
comment
В вашем коде отсутствует хотя бы один шаг (откуда взялись imageData?) Не могли бы вы опубликовать полный код?   -  person Jon Madison    schedule 10.03.2014
comment
извините, я пропустил это. Я отредактировал его.   -  person Yu-Shing Shen    schedule 11.03.2014


Ответы (4)


Я думаю, вы должны заменить параметр your options

Изменять:

NSString *imageString = [imageData base64EncodedStringWithOptions:0];

To:

NSString *imageString = [imageData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];

И на всякий случай:

- (NSString *)imageToNSString:(UIImage *)image
{
    NSData *data = UIImagePNGRepresentation(image);

    return [data base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];
}

- (UIImage *)stringToUIImage:(NSString *)string
{
    NSData *data = [[NSData alloc]initWithBase64EncodedString:string options:NSDataBase64DecodingIgnoreUnknownCharacters];

    return [UIImage imageWithData:data];
}

Помните, что это API iOS 7.

person Logan    schedule 11.03.2014
comment
Я попробовал ваш совет. Но я все еще получил неверную строку base64 - person Yu-Shing Shen; 11.03.2014
comment
Привет Ю, я использую это некоторое время, я думаю, что ваша ошибка где-то еще. Вы пробовали использовать методы? - person Logan; 11.03.2014
comment
Имеет ли значение вообще, если вы используете EncodingEndLineWithLineFeed вместо Encoding64CharacterLineLength (Swift)? Кодирование UIImage в строку base64 не совсем работает, но я попытаюсь использовать EncodingEndLineWithLineFeed. - person Crashalot; 04.05.2016
comment
@Crashalot Я недостаточно знаю о base64, чтобы дать вам достоверную информацию по этому вопросу, все, что я могу сказать, это то, что когда мне понадобилась эта функциональность, приведенный выше код сработал для меня. Я думаю, что перевод строки означает, что каждая строка разбивается на \n, а другая использует другой индикатор для длины строки. Не уверен в плюсах и минусах одного над другим. - person Logan; 04.05.2016
comment
хорошо, спасибо, логан. вы столкнулись с этой же проблемой: stackoverflow.com/questions/37034221/ - person Crashalot; 04.05.2016
comment
@Crashalot в то время нет. Мы запустили сервер, поэтому строки были отформатированы так, чтобы мы могли с ними работать. Возможно, они используют какое-то специальное форматирование, но я не имел дела с этим почти 2 года, так что это не очень свежо в моей памяти. Извините, я не могу больше помочь - person Logan; 04.05.2016

заменить + на %2B ios заменить все + на " " пробел, который делает изображение недействительным

также бэкэнд должен обрабатывать это тоже

- (NSString *)base64String:(UIImage*)image {return [[UIImageJPEGRepresentation(image,1) base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed] stringByReplacingOccurrencesOfString:@"+" withString:@"%2B"];}
person Fadi Abuzant    schedule 22.04.2017

Да, я обнаружил, что проблема в том, что я не кодирую URL.

В данных сообщения мой символ base64 «+» был переведен в символ «».

Поэтому я получаю недопустимую строку base64.

Спасибо, Логан.

person Yu-Shing Shen    schedule 11.03.2014

вдохновленный ответом Фади Абузанта, вот версия Swift 3

stringBase64 = stringBase64.replacingOccurrences(of: "+", with: "%2B")
person Amr Angry    schedule 03.05.2017