大家:
我已经做了好几天了。这里有一些背景知识。我正在使用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。
字符串是我们从protobuf调用中获得的字符串。第2部分从字符串中获取数据并将其转换回NSData格式以填充UIImage。以下是执行此操作的步骤:
现在,有了这些背景信息并且支持使用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 one和this one以及this one,但无法找到解决方案所需的信息。我承认我的一部分问题是我对图像不太了解(比如RGBA值和其他东西)。