我使用 AVFoundation
构建了一个相机。
在 AVCaptureStillImageOutput
完成其 captureStillImageAsynchronouslyFromConnection:completionHandler:
方法后,我像这样创建了一个 NSData 对象:
NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer];
一旦我获得了NSData
对象,我想要旋转图片,而不需要转换为UIImage
。我发现可以将其转换为CGImage
来实现。
在我拥有图像数据后,我开始将其转换为CGImage的过程中,但我发现CGImageRef
比NSData
对象大30倍。
这是我用于从NSData
转换为CGImage
的代码:
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)));
上述的
NSData
与CGImageRef
对象具有相同的length
。如果我试图保存图片,那么这张图片是一个30MB大小的图片,无法打开。
我完全不了解如何使用CGImage,所以我不确定我是否将NSData转换为CGImage然后再次转换回去时出现了错误,或者我是否需要调用某些方法来重新解压缩。
提前致谢,
Will
CGImageCreateWithJPEGDataProvider()
的参数吗?例如不插值或使用不同的渲染意图?这些可能会影响压缩。例如,插值可能会增加文件大小,因为颜色混合会增加图像中所表示的颜色数量。 - Ryan PoolosshouldInterpolate
设置为No似乎对文件大小没有影响。我想尽可能保留原始图像,但似乎其他因素正在影响我的代码...即使图像大小为30兆字节,我仍然应该能够保存和查看它,但目前我无法做到。 - Will