将二维图像数据从Web服务读入UIImage [英] Reading binary image data from a web service into UIImage
问题描述
我正在iPhone应用中使用网络服务。 Web服务方法返回一个响应,该响应具有多个字段(例如ID,描述等)。其中一个字段包含我需要在我的iPhone应用程序中转换为UIImage的二进制图像数据。
I'm consuming a web service in my iPhone app. The web service method returns a response which has several fields (eg. ID, Description, etc..). One of these fields contains binary image data which I need to convert to UIImage in my iPhone application.
我正在成功使用NSXMLParser从XML响应中提取数据。在XMLParser的解析器:foundCharacters:
选择器中,它给出了 NSString *
指向每个字段中的字符串。由于这是一个字符串,这是我在遇到图像字段时读取图像数据的方法:
I'm using a NSXMLParser successfully to extract data from the XML response. In the parser:foundCharacters:
selector of the XMLParser, it gives a NSString*
pointing to the string within each field. Since this is a string, this is what I do to read image data when i encounter the image field:
UIImage *img = [[UIImage alloc] initWithData:[string dataUsingEncoding:NSUTF8StringEncoding]];
但img变量在此行之后仍为nil。似乎XML字符串中的数据与转换不兼容。我在这做错了什么? (我能够将其他字段读入我的变量但不能读取此图像数据字段)
But img variable is still "nil" after this line. Seems like the data from XML string is not compatible with conversion. What am I doing wrong here? (I'm capable of reading other fields into my variables but not this image data field)
提前致谢..
推荐答案
根据fbrereto的回答,我设法使用此链接上的代码示例将字符串转换为NSData: http://www.cocoadev.com/index.pl?BaseSixtyFour (滚动到MiloBird用户的代码示例)。现在我可以成功构建图像。
Following fbrereto's answer, I managed to convert the string into NSData using a code sample at this link: http://www.cocoadev.com/index.pl?BaseSixtyFour (scroll to the code sample by MiloBird user). Now I can construct the image successfully.
它使用objective-c类别添加选择器 +(id)dataWithBase64EncodedString:(NSString *)string ;
到NSData类。这是我从上面的链接中提取的必要代码示例:
It uses objective-c categories to add the selector + (id)dataWithBase64EncodedString:(NSString *)string;
to the NSData class. Here's the necessary code sample I extracted from the above link:
//MBBase64.h
@interface NSData (MBBase64)
+ (id)dataWithBase64EncodedString:(NSString *)string; // Padding '=' characters are optional. Whitespace is ignored.
@end
//MBBase64.m
static const char encodingTable[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
@implementation NSData (MBBase64)
+ (id)dataWithBase64EncodedString:(NSString *)string;
{
if (string == nil)
[NSException raise:NSInvalidArgumentException format:nil];
if ([string length] == 0)
return [NSData data];
static char *decodingTable = NULL;
if (decodingTable == NULL)
{
decodingTable = malloc(256);
if (decodingTable == NULL)
return nil;
memset(decodingTable, CHAR_MAX, 256);
NSUInteger i;
for (i = 0; i < 64; i++)
decodingTable[(short)encodingTable[i]] = i;
}
const char *characters = [string cStringUsingEncoding:NSASCIIStringEncoding];
if (characters == NULL) // Not an ASCII string!
return nil;
char *bytes = malloc((([string length] + 3) / 4) * 3);
if (bytes == NULL)
return nil;
NSUInteger length = 0;
NSUInteger i = 0;
while (YES)
{
char buffer[4];
short bufferLength;
for (bufferLength = 0; bufferLength < 4; i++)
{
if (characters[i] == '\0')
break;
if (isspace(characters[i]) || characters[i] == '=')
continue;
buffer[bufferLength] = decodingTable[(short)characters[i]];
if (buffer[bufferLength++] == CHAR_MAX) // Illegal character!
{
free(bytes);
return nil;
}
}
if (bufferLength == 0)
break;
if (bufferLength == 1) // At least two characters are needed to produce one byte!
{
free(bytes);
return nil;
}
// Decode the characters in the buffer to bytes.
bytes[length++] = (buffer[0] << 2) | (buffer[1] >> 4);
if (bufferLength > 2)
bytes[length++] = (buffer[1] << 4) | (buffer[2] >> 2);
if (bufferLength > 3)
bytes[length++] = (buffer[2] << 6) | buffer[3];
}
realloc(bytes, length);
return [NSData dataWithBytesNoCopy:bytes length:length];
}
@end
谢谢大家!
这篇关于将二维图像数据从Web服务读入UIImage的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!