2013-05-03 64 views
1

我想将UIImage转换为base64字符串并上传它。UIImage base64不工作

这是我的代码:

NSData *imageData = UIImageJPEGRepresentation(self.image, 0.2); 


imageDataBase64 = [NSString stringWithFormat:@"data:image/jpeg;base64,%@", [imageData base64EncodedString]]; 


NSURL *url = [NSURL URLWithString:imageDataBase64]; 


NSData *imgdata = [NSData dataWithContentsOfURL:url]; 
UIImage *ret = [UIImage imageWithData:imgdata]; 

[imageView setImage:ret]; 

当我设置imageDataBase64作为的NSString这是工作。

更新:

base64EncodedString代码:

.H

void *NewBase64Decode(
    const char *inputBuffer, 
    size_t length, 
    size_t *outputLength); 

char *NewBase64Encode(
    const void *inputBuffer, 
    size_t length, 
    bool separateLines, 
    size_t *outputLength); 

@interface NSData (Base64) 

+ (NSData *)dataFromBase64String:(NSString *)aString; 
- (NSString *)base64EncodedString; 

@end 

.M

// 
// Mapping from 6 bit pattern to ASCII character. 
// 
static unsigned char base64EncodeLookup[65] = 
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/"; 

// 
// Definition for "masked-out" areas of the base64DecodeLookup mapping 
// 
#define xx 65 

// 
// Mapping from ASCII character to 6 bit pattern. 
// 
static unsigned char base64DecodeLookup[256] = 
{ 
    xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, 
    xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, 
    xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, 62, xx, xx, xx, 63, 
    52, 53, 54, 55, 56, 57, 58, 59, 60, 61, xx, xx, xx, xx, xx, xx, 
    xx, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 
    15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, xx, xx, xx, xx, xx, 
    xx, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 
    41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, xx, xx, xx, xx, xx, 
    xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, 
    xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, 
    xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, 
    xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, 
    xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, 
    xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, 
    xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, 
    xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, xx, 
}; 

// 
// Fundamental sizes of the binary and base64 encode/decode units in bytes 
// 
#define BINARY_UNIT_SIZE 3 
#define BASE64_UNIT_SIZE 4 

// 
// NewBase64Decode 
// 
// Decodes the base64 ASCII string in the inputBuffer to a newly malloced 
// output buffer. 
// 
// inputBuffer - the source ASCII string for the decode 
// length - the length of the string or -1 (to specify strlen should be used) 
// outputLength - if not-NULL, on output will contain the decoded length 
// 
// returns the decoded buffer. Must be free'd by caller. Length is given by 
// outputLength. 
// 
void *NewBase64Decode(
         const char *inputBuffer, 
         size_t length, 
         size_t *outputLength) 
{ 
    if (length == -1) 
    { 
     length = strlen(inputBuffer); 
    } 

    size_t outputBufferSize = 
    ((length+BASE64_UNIT_SIZE-1)/BASE64_UNIT_SIZE) * BINARY_UNIT_SIZE; 
    unsigned char *outputBuffer = (unsigned char *)malloc(outputBufferSize); 

    size_t i = 0; 
    size_t j = 0; 
    while (i < length) 
    { 
     // 
     // Accumulate 4 valid characters (ignore everything else) 
     // 
     unsigned char accumulated[BASE64_UNIT_SIZE]; 
     size_t accumulateIndex = 0; 
     while (i < length) 
     { 
      unsigned char decode = base64DecodeLookup[inputBuffer[i++]]; 
      if (decode != xx) 
      { 
       accumulated[accumulateIndex] = decode; 
       accumulateIndex++; 

       if (accumulateIndex == BASE64_UNIT_SIZE) 
       { 
        break; 
       } 
      } 
     } 

     // 
     // Store the 6 bits from each of the 4 characters as 3 bytes 
     // 
     // (Uses improved bounds checking suggested by Alexandre Colucci) 
     // 
     if(accumulateIndex >= 2) 
      outputBuffer[j] = (accumulated[0] << 2) | (accumulated[1] >> 4); 
     if(accumulateIndex >= 3) 
      outputBuffer[j + 1] = (accumulated[1] << 4) | (accumulated[2] >> 2); 
     if(accumulateIndex >= 4) 
      outputBuffer[j + 2] = (accumulated[2] << 6) | accumulated[3]; 
     j += accumulateIndex - 1; 
    } 

    if (outputLength) 
    { 
     *outputLength = j; 
    } 
    return outputBuffer; 
} 

// 
// NewBase64Encode 
// 
// Encodes the arbitrary data in the inputBuffer as base64 into a newly malloced 
// output buffer. 
// 
// inputBuffer - the source data for the encode 
// length - the length of the input in bytes 
// separateLines - if zero, no CR/LF characters will be added. Otherwise 
//  a CR/LF pair will be added every 64 encoded chars. 
// outputLength - if not-NULL, on output will contain the encoded length 
//  (not including terminating 0 char) 
// 
// returns the encoded buffer. Must be free'd by caller. Length is given by 
// outputLength. 
// 
char *NewBase64Encode(
         const void *buffer, 
         size_t length, 
         bool separateLines, 
         size_t *outputLength) 
{ 
    const unsigned char *inputBuffer = (const unsigned char *)buffer; 

#define MAX_NUM_PADDING_CHARS 2 
#define OUTPUT_LINE_LENGTH 64 
#define INPUT_LINE_LENGTH ((OUTPUT_LINE_LENGTH/BASE64_UNIT_SIZE) * BINARY_UNIT_SIZE) 
#define CR_LF_SIZE 2 

    // 
    // Byte accurate calculation of final buffer size 
    // 
    size_t outputBufferSize = 
    ((length/BINARY_UNIT_SIZE) 
    + ((length % BINARY_UNIT_SIZE) ? 1 : 0)) 
    * BASE64_UNIT_SIZE; 
    if (separateLines) 
    { 
     outputBufferSize += 
     (outputBufferSize/OUTPUT_LINE_LENGTH) * CR_LF_SIZE; 
    } 

    // 
    // Include space for a terminating zero 
    // 
    outputBufferSize += 1; 

    // 
    // Allocate the output buffer 
    // 
    char *outputBuffer = (char *)malloc(outputBufferSize); 
    if (!outputBuffer) 
    { 
     return NULL; 
    } 

    size_t i = 0; 
    size_t j = 0; 
    const size_t lineLength = separateLines ? INPUT_LINE_LENGTH : length; 
    size_t lineEnd = lineLength; 

    while (true) 
    { 
     if (lineEnd > length) 
     { 
      lineEnd = length; 
     } 

     for (; i + BINARY_UNIT_SIZE - 1 < lineEnd; i += BINARY_UNIT_SIZE) 
     { 
      // 
      // Inner loop: turn 48 bytes into 64 base64 characters 
      // 
      outputBuffer[j++] = base64EncodeLookup[(inputBuffer[i] & 0xFC) >> 2]; 
      outputBuffer[j++] = base64EncodeLookup[((inputBuffer[i] & 0x03) << 4) 
                | ((inputBuffer[i + 1] & 0xF0) >> 4)]; 
      outputBuffer[j++] = base64EncodeLookup[((inputBuffer[i + 1] & 0x0F) << 2) 
                | ((inputBuffer[i + 2] & 0xC0) >> 6)]; 
      outputBuffer[j++] = base64EncodeLookup[inputBuffer[i + 2] & 0x3F]; 
     } 

     if (lineEnd == length) 
     { 
      break; 
     } 

     // 
     // Add the newline 
     // 
     outputBuffer[j++] = '\r'; 
     outputBuffer[j++] = '\n'; 
     lineEnd += lineLength; 
    } 

    if (i + 1 < length) 
    { 
     // 
     // Handle the single '=' case 
     // 
     outputBuffer[j++] = base64EncodeLookup[(inputBuffer[i] & 0xFC) >> 2]; 
     outputBuffer[j++] = base64EncodeLookup[((inputBuffer[i] & 0x03) << 4) 
               | ((inputBuffer[i + 1] & 0xF0) >> 4)]; 
     outputBuffer[j++] = base64EncodeLookup[(inputBuffer[i + 1] & 0x0F) << 2]; 
     outputBuffer[j++] = '='; 
    } 
    else if (i < length) 
    { 
     // 
     // Handle the double '=' case 
     // 
     outputBuffer[j++] = base64EncodeLookup[(inputBuffer[i] & 0xFC) >> 2]; 
     outputBuffer[j++] = base64EncodeLookup[(inputBuffer[i] & 0x03) << 4]; 
     outputBuffer[j++] = '='; 
     outputBuffer[j++] = '='; 
    } 
    outputBuffer[j] = 0; 

    // 
    // Set the output length and return the buffer 
    // 
    if (outputLength) 
    { 
     *outputLength = j; 
    } 
    return outputBuffer; 
} 

@implementation NSData (Base64) 

// 
// dataFromBase64String: 
// 
// Creates an NSData object containing the base64 decoded representation of 
// the base64 string 'aString' 
// 
// Parameters: 
// aString - the base64 string to decode 
// 
// returns the autoreleased NSData representation of the base64 string 
// 
+ (NSData *)dataFromBase64String:(NSString *)aString 
{ 
    NSData *data = [aString dataUsingEncoding:NSASCIIStringEncoding]; 
    size_t outputLength; 
    void *outputBuffer = NewBase64Decode([data bytes], [data length], &outputLength); 
    NSData *result = [NSData dataWithBytes:outputBuffer length:outputLength]; 
    free(outputBuffer); 
    return result; 
} 

// 
// base64EncodedString 
// 
// Creates an NSString object that contains the base 64 encoding of the 
// receiver's data. Lines are broken at 64 characters long. 
// 
// returns an autoreleased NSString being the base 64 representation of the 
// receiver. 
// 
- (NSString *)base64EncodedString 
{ 
    size_t outputLength; 
    char *outputBuffer = 
    NewBase64Encode([self bytes], [self length], true, &outputLength); 

    NSString *result = [[[NSString alloc] initWithBytes:outputBuffer 
               length:outputLength 
               encoding:NSASCIIStringEncoding] autorelease]; 
    free(outputBuffer); 
    return result; 
} 

@end 
+0

你可以张贴方法'base64EncodedString '? – tkanzakic 2013-05-03 08:48:27

+0

尝试[link](http://www.imthi.com/blog/programming/iphone-sdk-base64-encode-decode.php) – LittleIDev 2013-05-03 08:54:11

+0

就这样您知道,前面加了'data:image/jpeg; base64'到编码数据被用来插入本地图像到HTML标记(和电子邮件IIRC)。由于大多数人都给了你一个很长的答案,最简单的答案就是删除前缀字符串,并且只有在你想要将你的图像数据加载到你写在设备上显示的HTML中时才会加上它。 – user352891 2013-05-03 09:17:36

回答

2

重复的问题! 尝试此链接:Convert between UIImage and Base64 string

总之,你需要使用base64类别NSData的编码为一个字符串,如这个 https://github.com/l4u/NSData-Base64/

类别提供了以下方法,你可以用它来转换NSData的类NSData到NSString(基本64编码)后退和前进。

+ (NSData *)dataFromBase64String:(NSString *)aString; 
- (NSString *)base64EncodedString; 

尝试改变这一行:

imageDataBase64 = [NSString stringWithFormat:@"data:image/jpeg;base64,%@", [imageData base64EncodedString]] 

NSString *imageDataBase64encodedString = [imageData base64EncodedString]; 

为了解码它,你可以用相反的方法:

NSData *theImageData = [NSData dataFromBase64String:imageDataBase64encodedString]; 
UIImage *ret = [UIImage theImageData]; 
+0

您需要解码未重新编码的数据并重复报告 – 2013-05-03 08:52:13

+0

您可以将NSData编码为base64字符串。看看这个链接,了解这意味着什么。 http://searchnetworking.techtarget.com/definition/encoding-and-decoding 我不熟悉报告重复。据我所知,您将原件作为答案发布。 – 2013-05-03 08:53:41

+0

他得到了正确的编码部分。他需要解码他想要提供给图像的数据 – 2013-05-03 08:55:09

0

你会INITING一个UIImage与之前解码图像数据它。 UIImage不透明地处理base64