将数据字符串转换为图像

时间:2014-06-08 13:15:32

标签: ios objective-c

我有一个jpg图像,我正在使用UIImageJPEGRepresentation函数

转换为数据

然后我将数据发送到服务器在线并在需要时将其恢复,但我得到了这个字符串:

<ffd8ffe0 00104a46 49460001 01000001 00010000 ffe10058 45786966 00004d4d...>

我不知道如何将其转换回图像

提前致谢

4 个答案:

答案 0 :(得分:1)

我设法通过将字符串转换为base64字符串来找到一种方法:

+ (NSString *) encodeToBase64:(NSData *) rawBytes {
    return [StringMethods encodeToBase64:(const uint8_t*) rawBytes.bytes length:rawBytes.length];
}

+ (NSString *) encodeToBase64:(const uint8_t *)input length:(NSInteger) length {
    NSMutableData *data = [NSMutableData dataWithLength:((length + 2) / 3) * 4];
    uint8_t *output = (uint8_t *)data.mutableBytes;
    for (NSInteger i = 0; i < length; i += 3) {
        NSInteger value = 0;
        for (NSInteger j = i; j < (i + 3); j++) {
            value <<= 8;
            if (j < length) {
                value |= (0xFF & input[j]);
            }
        }

        NSInteger index = (i / 3) * 4;
        output[index + 0] =                    encodingTable[(value >> 18) & 0x3F];
        output[index + 1] =                    encodingTable[(value >> 12) & 0x3F];
        output[index + 2] = (i + 1) < length ? encodingTable[(value >> 6)  & 0x3F] : '=';
        output[index + 3] = (i + 2) < length ? encodingTable[(value >> 0)  & 0x3F] : '=';
    }
    return [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
}

然后我将它保存到服务器上,然后在加载回来时我使用了这个函数:

- (NSData *)base64DataFromString: (NSString *)string {
    unsigned long ixtext, lentext;
    unsigned char ch, inbuf[4], outbuf[3];
    short i, ixinbuf;
    Boolean flignore, flendtext = false;
    const unsigned char *tempcstring;
    NSMutableData *theData;
    if (string == nil){
        return [NSData data];
    }
    ixtext = 0;
    tempcstring = (const unsigned char *)[string UTF8String];
    lentext = [string length];
    theData = [NSMutableData dataWithCapacity: lentext];
    ixinbuf = 0;
    while (true) {
        if (ixtext >= lentext) {
            break;
        }
        ch = tempcstring [ixtext++];
        flignore = false;
        if ((ch >= 'A') && (ch <= 'Z')) {
            ch = ch - 'A';
        } else if ((ch >= 'a') && (ch <= 'z')) {
            ch = ch - 'a' + 26;
        } else if ((ch >= '0') && (ch <= '9')) {
            ch = ch - '0' + 52;
        } else if (ch == '+') {
            ch = 62;
        } else if (ch == '=') {
            flendtext = true;
        } else if (ch == '/') {
            ch = 63;
        } else {
            flignore = true;
        }
        if (!flignore) {
            short ctcharsinbuf = 3;
            Boolean flbreak = false;
            if (flendtext) {
                if (ixinbuf == 0) {
                    break;
                }
                if ((ixinbuf == 1) || (ixinbuf == 2)) {
                    ctcharsinbuf = 1;
                } else {
                    ctcharsinbuf = 2;
                }
                ixinbuf = 3;
                flbreak = true;
            }
            inbuf [ixinbuf++] = ch;
            if (ixinbuf == 4) {
                ixinbuf = 0;
                outbuf[0] = (inbuf[0] << 2) | ((inbuf[1] & 0x30) >> 4);
                outbuf[1] = ((inbuf[1] & 0x0F) << 4) | ((inbuf[2] & 0x3C) >> 2);
                outbuf[2] = ((inbuf[2] & 0x03) << 6) | (inbuf[3] & 0x3F);
                for (i = 0; i < ctcharsinbuf; i++) {
                    [theData appendBytes: &outbuf[i] length: 1];
                }
            }
            if (flbreak) {
                break;
            }
        }
    }
    return theData;
}

最后将它转换为图像我就是这个简单的方法:

UIImage *image = [UIImage imageWithData:imageData];

答案 1 :(得分:0)

您显示的是字符串,还是您显示NSData时获得的字符串?我相信如果你记录二进制数据,就会显示出来。

你所展示的是十六进制数据,而不是其他海报建议的base64。

您可以编写使用sscanf()的代码从十六进制字符串中提取int值,也可以创建一个NSScanner对象并使用它的scanHexInt方法。如果你谷歌“将十六进制NSString转换为整数”,你应该找到两种方法。

由于您的值之间有空格,因此NSScanner可能是您最好的选择。

答案 2 :(得分:0)

问题

您正在向服务器NSData发送NSString,这就是为什么您将NSData格式的NSString读取为NSString

解决方案

首先,您需要将NSData *imageData= UIImagePNGRepresentation(yourImage); NSString *encodedString = [imageData base64EncodedStringWithOptions:0]; 作为#import "NSData+Base64.h" //This function converts your base64string (NSString Class) to NSData NSData *data = [[NSData alloc] initWithData:[NSData dataFromBase64String:base64String]]; //Here is where you convert it to UIImage UIImage *image = [UIImage imageWithData:data]; 正确发送到服务器:

{{1}}

将它发送到NSString后,现在你得到它回来像这样操纵它。我正在使用NSData Base64 library 来执行此任务。

您只需将这些文件手动复制到项目中即可。将类导入到项目中,并将这些行导入代码:

{{1}}

P.S你也可以按照你的回答,这对我来说似乎是正确的,但我只是想让你知道你哪里做错了。

答案 3 :(得分:-1)

这似乎是转换的好答案:

NSData *dataImage = [[NSData alloc] init];
dataImage = UIImagePNGRepresentation(image);
NSString *stringImage = [dataImage base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
您可以在此处找到

NSString to UIImage