13

Here is my code.

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

And I always get invalid base64 string which include space.

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

So Confused.

When I try remove the space in base64 string, and decode it.

I can't get origin image.

Yu-Shing Shen
  • 373
  • 1
  • 5
  • 10

4 Answers4

24

I think you should replace the your options parameter

Change:

NSString *imageString = [imageData base64EncodedStringWithOptions:0];

To:

NSString *imageString = [imageData base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed];

And just in case you'd like it:

- (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];
}

Remember that this is an iOS 7 api.

Logan
  • 52,262
  • 20
  • 99
  • 128
  • I have tried your advise. But I still got invalid base64 string – Yu-Shing Shen Mar 11 '14 at 03:24
  • Hi Yu, I have been using this for a while, I think your error is somewhere else. Did you try using the methods? – Logan Mar 11 '14 at 03:29
  • Does it make a difference generally if you use EncodingEndLineWithLineFeed instead of Encoding64CharacterLineLength (Swift)? Encoding UIImage to base64 string isn't quite working, but will trying using EncodingEndLineWithLineFeed – Crashalot May 04 '16 at 16:32
  • @Crashalot I don't know enough about base64 to give you strong information on this subject, all I can say is when I needed this functionality, the above code worked for me. I think line feed means each line is broken up by `\n` and the other uses a different indicator for line lengths. Not sure the pros and cons of one over the other. – Logan May 04 '16 at 17:32
  • ok thanks logan. did you happen to encounter this same problem: http://stackoverflow.com/questions/37034221/encoding-uiimage-to-base64-string-not-working-when-transferred-to-server – Crashalot May 04 '16 at 17:34
  • @Crashalot at the time, no. We ran the server, so the strings were formatted in a way we could work with. It might be possible they use some special formatting, but I haven't dealt w/ this stuff in almost 2 years, so it's not very fresh in my mind. Sorry I can't be more help – Logan May 04 '16 at 17:43
4

replace + to %2B ios replace all + to " " space that make image invalid

also backend must handle it too

- (NSString *)base64String:(UIImage*)image {return [[UIImageJPEGRepresentation(image,1) base64EncodedStringWithOptions:NSDataBase64EncodingEndLineWithLineFeed] stringByReplacingOccurrencesOfString:@"+" withString:@"%2B"];}
Fadi Abuzant
  • 476
  • 8
  • 13
3

Yap, I find the problem is I don't encode the url.

In the post data my base64 "+" character was translate to " " character.

So I get the invalid base64 string.

Thanks Logan.

Yu-Shing Shen
  • 373
  • 1
  • 5
  • 10
1

inspired from Fadi Abuzant answer here is the Swift 3 version

stringBase64 = stringBase64.replacingOccurrences(of: "+", with: "%2B")
Amr Angry
  • 3,711
  • 1
  • 45
  • 37