如果您是 iOS 5.0 SDK 以上的使用者,這篇文章你將不再適用,請前往索引式搜索頁面中的 AVFoundation 分類項目,取得新的設定方式。
在之前Camera/攝影機畫面的擷取方式-前篇中,已經成功取得攝影機的內容,但是如果要對齊內容做影像處理時該怎麼辦?在 iOS Developer Library 中有提供另一種解決方式,程式碼如下。
在之前Camera/攝影機畫面的擷取方式-前篇中,已經成功取得攝影機的內容,但是如果要對齊內容做影像處理時該怎麼辦?在 iOS Developer Library 中有提供另一種解決方式,程式碼如下。
//當Output Buffer有東西寫入時就會出發此函式,換句話說按照之前的設定,每1/15秒就會出發此函式一次
- (void)captureOutput:(AVCaptureOutput *)captureOutput didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer fromConnection:(AVCaptureConnection *)connection {
//宣告一個UIImage型態的指標來放置Output Buffer的東西
//imageFromSampleBuffer函式則是將Buffer內的東西作正規化處理來符合UIImage型態
UIImage *image = [self imageFromSampleBuffer:sampleBuffer];
//將對image處理的程式碼寫在這裡(目前image就是Camera的擷取畫面)
}
下列是 iOS Developer Library 所提供的程式碼,目的是對 Output Buffer 內的資料進行處理,並輸出成 UIImage 型態。
- (UIImage *) imageFromSampleBuffer:(CMSampleBufferRef) sampleBuffer
{
CVImageBufferRef imageBuffer = CMSampleBufferGetImageBuffer(sampleBuffer);
// Lock the base address of the pixel buffer
CVPixelBufferLockBaseAddress(imageBuffer,0);
// Get the number of bytes per row for the pixel buffer
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(imageBuffer);
// Get the pixel buffer width and height
size_t width = CVPixelBufferGetWidth(imageBuffer);
size_t height = CVPixelBufferGetHeight(imageBuffer);
// Create a device-dependent RGB color space
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
if (!colorSpace)
{
NSLog(@"CGColorSpaceCreateDeviceRGB failure");
return nil;
}
// Get the base address of the pixel buffer
void *baseAddress = CVPixelBufferGetBaseAddress(imageBuffer);
// Get the data size for contiguous planes of the pixel buffer.
size_t bufferSize = CVPixelBufferGetDataSize(imageBuffer);
// Create a Quartz direct-access data provider that uses data we supply
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, baseAddress, bufferSize, NULL);
// Create a bitmap image from data supplied by our data provider
CGImageRef cgImage =
CGImageCreate(width,
height,
8,
32,
bytesPerRow,
colorSpace,
kCGImageAlphaNoneSkipFirst | kCGBitmapByteOrder32Little,
provider,
NULL,
true,
kCGRenderingIntentDefault);
CGDataProviderRelease(provider);
CGColorSpaceRelease(colorSpace);
// Create and return an image object representing the specified Quartz image
UIImage *image = [UIImage imageWithCGImage:cgImage];
CGImageRelease(cgImage);
CVPixelBufferUnlockBaseAddress(imageBuffer, 0);
return image;
}
沒有留言:
張貼留言