【问题标题】:Converting byte array coming from Web service to UIImage iPhone将来自 Web 服务的字节数组转换为 UIImage iPhone
【发布时间】:2017-08-02 21:02:58
【问题描述】:

我是这项技术的新手。 我搜索了很多,但找不到任何相关的。 在我的应用程序中,我从 Web 服务接收字节数组,我从 Web 服务接收的字节数组是

[137,80,78,71,13,10,26,10,0,0,0,13,73,72,68,82,0,0,1,195,0,0,1,195,8, 2,0,0,0,215,2...]

我想将这个 byte 数组 转换成 UIImage 以便在 UIImageView 中显示它。

【问题讨论】:

  • 为了帮助您,了解您从 Web 服务收到的确切信息非常重要。它是NSArray 的一个实例吗?如果是这样,这个数组里面有什么? NSNumber, NSString?请在您的问题中更具描述性。
  • 我已经在我的问题中提到了我从网络服务获得的响应,[137,80,78,71,13,10,26,10,0,0,0,13,73, 72,68...]。我收到的数据是字节数组,即一种数组,我希望将此字节数组转换为 UIImage
  • 它是一个 void * 指针吗?显然不是,否则 -dataWithBytes: 会正常工作。没有更多代码,没有人会帮助你。在问题中检索字节数组的位置添加代码。
  • 我已经实现了 Apurv 下面给出的代码,但是它不起作用,它给了我错误,我在我的应用程序中使用了 ARC。
  • 正如我所说,使用从 Web 服务获取字节数组的代码更新您的问题。

标签: iphone objective-c web-services


【解决方案1】:

使用下面的 UIImage 构造函数。

+ (UIImage *)imageWithData:(NSData *)data;

NSData *data = [NSData dataWithBytes:YOUR_BYTE_ARRAY length:ARRAY_LENGTH];

UIImage *img = [UIImage imageWithData:data];

UIImageView *imgView = [[UIImageView alloc]initWithImage:img];

【讨论】:

  • 感谢您的回复,但它不起作用,请有其他建议
  • 你能把你的 Byte[] 转换成 NSData 吗?
  • 字节 byteData = (Byte)malloc(len);memcpy(byteData, [数据字节], len);说这样的话?
  • NSData *data = [NSData dataWithBytes:(const void *)bytes length:(NSUInteger)length];现在,如答案中所述,在 imageWithData 中使用此数据。
  • 我从 Web 服务中获取它,我不知道如何获取 (const void*) 和它的长度。
【解决方案2】:

上面字节数组中的前 8 个字节,\211 P N G \r \n \032 \n(或十进制的137,80,78,71,13,10,26,10)表明这是一个PNG 文件。

至少,您应该能够将整个字节序列保存到文件中,然后使用+ (UIImage *)imageNamed:(NSString *)name+ (UIImage *)imageWithContentsOfFile:(NSString *)path 加载它。例如:

  UIImage *myImage = [UIImage imageNamed:@"myfile.png"]
                                      // myfile.png should be in the main bundle

(由于这个原因,Apurv 的方法更直接,也更好。但是由于您对它有这么大的困难,我想我会建议一种稍微不同的方法。)

【讨论】:

    【解决方案3】:

    您需要先对数据进行 Base64 解码。从许多 SOAP Web 服务返回的数据是 base 64 编码的,有时还有嵌入网站的原始数据。这很简单,但使用别人创建的库是最简单的。

    首先将其包含在您的项目中,并将 .h 包含在此文件中:https://github.com/nicklockwood/Base64

    NSString *base64String = @"**YOUR BYE ARRAY HERE**";
    UIImage *imageOrig = [UIImage imageWithData:[NSData dataFromBase64String:base64String]];
    UIImageView *imageView = [[UIImageView alloc]initWithImage:imageOrig];
    

    应该这样做。在我以前的经验中,我只是将通过 web 服务获得的任何数据 blob 放入一个字符串中,然后使用这种方法创建图像,它工作得很好,这里有一个关于 Base64 编码和解码细节的精彩讨论:http://cocoadev.com/wiki/BaseSixtyFour 这是我用来创建我的课程,但尼克在 gitHub 上的代码要好得多,因为它符合 ARC。

    【讨论】:

    • Base64 encoding 使用有限的字符集,通常是 (26 + 26 + 10 = 62) 字母数字字符以及“+”和“/”。原贴提供的样本字节数组有一些大于127的十进制值,例如137、195和215;这表明它甚至不是 7 位 ASCII,更不用说 base64。
    【解决方案4】:

    从 Webservice 我们得到NSNumber 的数组。我们必须将其转换为NSData,如下所示:

    NSMutableData *data = [[NSMutableData alloc] initWithCapacity: [strings count]];
    for( NSNumber *number in strings) {
        char byte = [number charValue];
        [data appendBytes: &byte length: 1];
    }
    

    NSData 隐蔽到UIImage

    UIImage *imageOrig = [UIImage imageWithData:data];
    

    我们也从NSData 中获取 JSON。

    NSError *error1 = nil;
    NSArray *jsonArray = [NSJSONSerialization JSONObjectWithData:data options:kNilOptions error:&error1];
    
    if (error1 != nil) {
        NSLog(@"Error parsing JSON.");
    } else {
        NSLog(@"Array: %@", jsonArray);
    }
    

    【讨论】:

      【解决方案5】:
        //Use this
      
      CGColorSpaceRef colorSpace=CGColorSpaceCreateDeviceRGB();
      CGContextRef bitmapContext=CGBitmapContextCreate(YOUR_BYTE_ARRAY, w, h, 8, 4*w, colorSpace,  kCGImageAlphaPremultipliedLast | kCGBitmapByteOrderDefault);
      CFRelease(colorSpace);
      free(YOUR_BYTE_ARRAY);
      CGImageRef cgImage=CGBitmapContextCreateImage(bitmapContext);
      CGContextRelease(bitmapContext);
      
      UIImage *newimage = [UIImage imageWithCGImage:cgImage];
      [yourImageView setImage:newimage];
      CGImageRelease(cgImage);
      

      也许对你有帮助……

      【讨论】:

      • 你能帮我把从网络服务收到的数据转换成 YOUR_BYTE_ARRAY 即字节数组
      • 如果不是,您正在从 Web 服务接收字节数组,那么您正在从 Web 服务接收什么
      • 我正在做这样的事情,对吗? CGContextRef bitmapContext=CGBitmapContextCreate((__bridge void*)[arr valueForKey:@"ImageData"], 250.0, 250.0, 8, 4*250.0, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrderDefault);
      • 使用这个 CGColorSpaceRef colorSpace=CGColorSpaceCreateDeviceRGB(); CGContextRef bitmapContext=CGBitmapContextCreate([arr valueForKey:@"ImageData"],50.0,50.0,100,100.0, colorSpace, kCGImageAlphaPremultipliedLast | kCGBitmapByteOrderDefault); CFRelease(颜色空间); CGImageRef cgImage=CGBitmapContextCreateImage(bitmapContext); CGContextRelease(bitmapContext); UIImage *newimage = [UIImage imageWithCGImage:cgImage]; [yourImageView setImage:newimage]; CGImageRelease(cgImage);
      • 它给了我错误,因为 Objective-C 指针类型 'id' 到 C 指针类型 'void *' 的隐式转换需要 [arr valueForKey:@"ImageData"] 的桥接转换
      【解决方案6】:
      #import "NSDataAdditions.h"
      
      NSData *dataObj = [NSData dataWithBase64EncodedString:StringImage];
      UIImage *Image = [UIImage imageWithData:dataObj];
      

      【讨论】:

      • 方法dataWithBase64EncodedString:没有出现在Apple's documentation for the class NSData中。此方法可能是您已实现的NSData 上的category 的一部分。因此,如果不知道/拥有dataWithBase64EncodedString: 的实现,上面的代码 sn-p 并不是很有用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-10-07
      相关资源
      最近更新 更多