使用base64从std :: string创建新的CGIImage或CGImageRef

时间:2014-07-07 17:25:14

标签: objective-c uiimage nsdata cgimage cfdata

大家:

我已经做了好几天了。这里有一些背景知识。我正在使用protobuf将图像发送到服务器。图像直接来自相机,因此它不是jpeg也不是png。我找到了使用CGImage从UIImage获取数据的代码来创建CGImageRef。请参阅以下代码:

- (UIImage *)testProcessedImage:(UIImage *)processedImage
{
    CGImageRef imageRef = processedImage.CGImage;
    NSData *data1 = (NSData *) CFBridgingRelease(CGDataProviderCopyData(CGImageGetDataProvider(imageRef)));

Google protobuf使用C ++代码向服务器发送和接收字节。当我试图将数据字节返回到NSData并使用该数据为init分配UIImage时,UIImage总是为零。 This tells me that my NSData is not in the correct format.

起初,我认为我的问题在于C ++转换,如上一个问题here所示。但是在经历了很多挫折之后,我在中间删除了所有内容,并使用CGImageRef创建了一个UIImage并且它工作正常。请参阅以下代码:

- (UIImage *)testProcessedImage:(UIImage *)processedImage
{
    CGImageRef imageRef = processedImage.CGImage;
    NSData *data1 = (NSData *) CFBridgingRelease(CGDataProviderCopyData(CGImageGetDataProvider(imageRef)));

    // Added this line and cut out everything in the middle
    UIImage *image = [UIImage imageWithCGImage:imageRef];

以下是我最终需要做的事情的描述。有两个部分。第1部分使用UIImage并将其转换为std :: string。

  1. 采取UIImage
  2. 从中获取NSData
  3. 将数据转换为unsigned char *
  4. 将unsigned char *填入std :: string
  5. 字符串是我们从protobuf调用中获得的字符串。第2部分从字符串中获取数据并将其转换回NSData格式以填充UIImage。以下是执行此操作的步骤:

    1. 将std :: string转换为char数组
    2. 将char数组转换为const char *
    3. 将char *放入NSData
    4. 返回NSData
    5. 现在,有了这些背景信息并且支持使用CGImageRef填充UIImage的事实,这意味着该格式的数据是填充UIImage的正确格式,我正在寻找帮助来弄清楚如何获取base64.data()到CFDataRef或CGImageRef。以下是我的测试方法:

      - (UIImage *)testProcessedImage:(UIImage *)processedImage
      {
          CGImageRef imageRef = processedImage.CGImage;
          NSData *data1 = (NSData *) CFBridgingRelease(CGDataProviderCopyData(CGImageGetDataProvider(imageRef)));
      
          unsigned char *pixels = (unsigned char *)[data1 bytes];
          unsigned long size = [data1 length];
      
          // ***************************************************************************
          // This is where we would call transmit and receive the bytes in a std::string
          //
          // The following line simulates that:
          //
          const std::string byteString(pixels, pixels + size);
          //
          // ***************************************************************************
      
          // converting to base64        
          std::string encoded = base64_encode(reinterpret_cast<const unsigned char*>(byteString.c_str()), byteString.length());
      
          // retrieving base64        
          std::string decoded = base64_decode(encoded);
      
          // put byte array back into NSData format
          NSUInteger usize = decoded.length();
          const char *bytes = decoded.data();
          NSData *data2 = [NSData dataWithBytes:(const void *)bytes length:sizeof(unsigned char)*usize];
          NSLog(@"examine data");
      
          // But when I try to alloc init a UIImage with the data, the image is nil
          UIImage *image2 = [[UIImage alloc] initWithData:data2];
          NSLog(@"examine image2");
      
      
          // *********** Below is my convoluted approach at CFDataRef and CGImageRef **************** 
      
          CFDataRef dataRef = CFDataCreate( NULL, (const UInt8*) decoded.data(), decoded.length() );
          NSData *myData = (__bridge NSData *)dataRef;
          //CGDataProviderRef ref = CGDataProviderCreateWithCFData(dataRef);
          id sublayer = (id)[UIImage imageWithCGImage:imageRef].CGImage;
          UIImage *image3 = [UIImage imageWithCGImage:(__bridge CGImageRef)(sublayer)];
      
          return image3;
      }
      

      任何不经意的观察者都可以看到,我需要帮助。帮助!!! 我在SO上尝试了其他一些问题,例如this onethis one以及this one,但无法找到解决方案所需的信息。我承认我的一部分问题是我对图像不太了解(比如RGBA值和其他东西)。

0 个答案:

没有答案