2013-01-23 57 views
0

我到NSData的和NSData的一個圖像轉換爲使用如何從圖像的nsdata最小化base64字符串的長度?

NSData *imagedata = UIImageJPEGRepresentation(imageView.image, 0.1f); 
NSString *c = [NSString base64StringFromData:imagedata]; 

將fn base64string爲stringconversion

+ (NSString*)base64forData:(NSData*)theData { 

    const uint8_t* input = (const uint8_t*)[theData bytes]; 
    NSInteger length = [theData length]; 

    static char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz/="; 

    NSMutableData* data = [NSMutableData dataWithLength:((length + 2)/3) * 4]; 
    uint8_t* output = (uint8_t*)data.mutableBytes; 

    NSInteger i; 
    for (i=0; i < length; i += 3) { 
     NSInteger value = 0; 
     NSInteger j; 
     for (j = i; j < (i + 3); j++) { 
      value <<= 8; 

      if (j < length) { 
      value |= (0xFF & input[j]); 
      } 
     } 

     NSInteger theIndex = (i/3) * 4; 
     output[theIndex + 0] =     table[(value >> 18) & 0x3F]; 
     output[theIndex + 1] =     table[(value >> 12) & 0x3F]; 
     output[theIndex + 2] = (i + 1) < length ? table[(value >> 6) & 0x3F] : '='; 
     output[theIndex + 3] = (i + 2) < length ? table[(value >> 0) & 0x3F] : '='; 
    } 

    return [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; 
} 

但所得base64string太長,其長度爲300000以上 即

int len = c.length; 

len的值超過300000.

的圖像是3至4 MB INFACT予壓縮圖像到0.1F

NSData *imagedata = UIImageJPEGRepresentation(iivv.image, 0.1f); 

如何最小化的長度,是有從NSData的base64conversion任何其他代碼?

+0

請使用英文編號。非亞洲人不太可能熟悉'十萬個'。什麼是'0.1f'?此外,是什麼讓你認爲base64字符串是「太長」? – Pete

+0

查看我編輯的問題 – NAZIK

+0

0.1f表示壓縮比例,根據那nsdata大小將減少 – NAZIK

回答

7

Base64將始終比原始數據具有更大的空間要求,因爲它不使用一個字節中的所有位。這是爲了確保較高位在從一個系統交給另一個系統時不會造成問題而有意地完成的。所以實際上它爲了傳輸安全而交換空間。

它被稱爲Base64,因爲它只爲每個字節使用6位(2^6 = 64),因此在原始數據只有4的情況下有效佔用5個字節。換句話說,大小將增加25% 。

Base64編碼器當然不在意你輸入的字節是什麼,所以你可以自由地壓縮數據,只要它仍然是它自己的格式(例如創建一個PNG或JPG從未壓縮的圖像數據中取出),然後將其編碼爲Base64。

+0

實際上,一個base64字符串的大小應爲約137%的原始數據(http://en.wikipedia.org/wiki/Base64# MIME) – Pete

+0

哦,正確的......我在寫這個了我的頭頂部,但你的想法:) –

+0

有沒有什麼辦法,以儘量減少圖象 - – NAZIK

相關問題