我已经使用AVFoundation
构建了一个摄像头。将NSData转换为CGImage,然后返回NSData使文件太大
一旦我AVCaptureStillImageOutput
已经完成了captureStillImageAsynchronouslyFromConnection:completionHandler:
方法,我创建了一个NSData对象是这样的:
NSData *imageData = [AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer];
一旦我有NSData
对象,我想-without-转换为UIImage
旋转图像。我发现我可以转换成CGImage
这样做。
当我有了imageData后,我开始转换为CGImage的过程,但是我发现CGImageRef
最终比对象NSData
大了三十倍。
下面是我用从NSData
转换为CGImage
代码:
CGDataProviderRef imgDataProvider = CGDataProviderCreateWithCFData((__bridge CFDataRef)(imageData));
CGImageRef imageRef = CGImageCreateWithJPEGDataProvider(imgDataProvider, NULL, true, kCGRenderingIntentDefault);
如果我尝试NSLog
出图像的大小,涉及到30兆,当NSData
是1.5-2兆字节图片!
size_t imageSize = CGImageGetBytesPerRow(imageRef) * CGImageGetHeight(imageRef);
NSLog(@"cgimage size = %zu",imageSize);
我想,也许当你从NSData的去CGImage,图像解压缩,然后也许如果我改回NSData的,它可能会回到正确的文件大小。
imageData = (NSData *) CFBridgingRelease(CGDataProviderCopyData(CGImageGetDataProvider(imageRef)));
上面NSData
具有相同length
作为CGImageRef
对象。
如果我试图保存图像,图像是一个30mb图像,无法打开。
我完全是使用CGImage的新手,所以我不确定我是否从NSData转换为CGImage并且返回不正确,或者如果我需要调用某种方法来再次解压缩。
由于提前,
将
你有没有试过玩'CGImageCreateWithJPEGDataProvider()'的参数?如不插入或不同的意图?这些可能会影响压缩。插值例如可以轻松地增加文件大小,因为颜色混合会增加图像中表示的颜色数量。 –
@RyanPoolos将'shouldInterpolate'设置为No似乎对文件大小没有影响。 我想尽可能地保留原始图像,但它看起来像别的东西正在影响我的代码...即使图像是30兆,我仍然不能保存和查看它,这我目前不能? – Will