将NSData转换为CGImage然后再转换回NSData会使文件太大

时间:2013-10-22 20:41:04

标签: ios objective-c nsdata cgimage cgimageref

我使用AVFoundation制作了相机。

我的AVCaptureStillImageOutput完成其captureStillImageAsynchronouslyFromConnection:completionHandler:方法后,我创建了一个这样的NSData对象:

         NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer];

我拥有NSData对象后,我想将图片 - 不转换 - 转换为UIImage。我发现我可以转换为CGImage来执行此操作。

获得imageData之后,我开始转换为CGImage的过程,但我发现CGImageRef最终比NSData对象大三十倍。

以下是我用来从CGImage转换为NSData的代码:

CGDataProviderRef imgDataProvider = CGDataProviderCreateWithCFData((__bridge CFDataRef)(imageData));
CGImageRef imageRef = CGImageCreateWithJPEGDataProvider(imgDataProvider, NULL, true, kCGRenderingIntentDefault);

如果我尝试NSLog图像的大小,当NSData为1.5-2兆字节图像时,它会达到30兆字节!

size_t imageSize = CGImageGetBytesPerRow(imageRef) * CGImageGetHeight(imageRef);

    NSLog(@"cgimage size = %zu",imageSize);

我想也许当你从NSData转到CGImage时,图像会解压缩,然后如果我转换回NSData,它可能会回到正确的文件大小。

imageData = (NSData *) CFBridgingRelease(CGDataProviderCopyData(CGImageGetDataProvider(imageRef)));

以上NSDatalength对象具有相同的CGImageRef

如果我尝试保存图像,则图像是无法打开的30mb图像。

我对使用CGImage完全不熟悉,所以我不确定我是从NSData转换为CGImage还是错误地返回,或者我是否需要调用某种方法再次解压缩。

提前致谢,

威尔

0 个答案:

没有答案