我已經使用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