2013-05-03 66 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