我有一个jpg图像,我正在使用UIImageJPEGRepresentation
函数
然后我将数据发送到服务器在线并在需要时将其恢复,但我得到了这个字符串:
<ffd8ffe0 00104a46 49460001 01000001 00010000 ffe10058 45786966 00004d4d...>
我不知道如何将其转换回图像
提前致谢
答案 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];
您可以在此处找到