1

我使用将图像转换为 NSData 并将 NSData 转换为 base64string

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

字符串转换的 fn

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

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

    static char table[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";

    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 事实上我将图像压缩到 0.1f

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

如何最小化长度,还有其他代码用于从 NSData 进行 base64conversion 吗?

4

1 回答 1

7

Base64 总是比原始数据需要更大的空间,因为它不会使用一个字节中的所有位。这是有意完成的,以确保更高位在从一个系统传递到另一个系统时不会引起问题。所以实际上它用空间换取了传输安全。

它之所以被称为 Base64,是因为它每个字节只使用 6 位(2^6=64),因此有效地占用了原始数据只有 4 个字节的 5 个字节。或者换句话说:大小将增加 25%。

Base64 编码器当然不关心你输入的字节代表什么,所以你可以自由地压缩你的数据,只要它仍然是它自己的格式(例如,创建一个 PNG 或 JPG未压缩的图像数据),然后将其编码为 Base64。

于 2013-01-23T15:33:45.170 回答