2009-08-23 7 views
3

Я хотел бы получить изображение, которое отображается на UIImagePickerController, когда пользователь использует камеру. И когда я получаю, я хочу обработать изображение и отображать вместо обычного просмотра камеры.iPhone: Получить предварительный просмотр камеры

Но проблема в том, когда я хочу получить представление камеры, изображение - это просто черный прямоугольник.

Вот мой код:

UIView *cameraView = [[[[[[imagePicker.view subviews] objectAtIndex:0] 
         subviews] objectAtIndex: 0] 
         subviews] objectAtIndex: 0]; 

UIGraphicsBeginImageContext(CGSizeMake(320, 427)); 
[cameraView.layer renderInContext: UIGraphicsGetCurrentContext()]; 
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 

imageToDisplay.image = [PixelProcessing processImage: viewImage]; //In this case the image is black 
//imageToDisplay.image = viewImage; //In this case the image is black too 
//imageToDisplay.image = [UIImage imageNamed: @"icon.png"];  //In this case image is being displayed properly 

Что я делаю неправильно?

Спасибо.

ответ

7

Этот тоже работает неплохо. Используйте его, когда просмотр камеры открыта:

UIImage *viewImage = [[(id)objc_getClass("PLCameraController") 
         performSelector:@selector(sharedInstance)] 
         performSelector:@selector(_createPreviewImage)]; 

Но насколько я выяснил, что это приносит те же результаты, чем следующее решение, которое принимает «скриншот» текущего экрана:

extern CGImageRef UIGetScreenImage(); 

CGImageRef cgoriginal = UIGetScreenImage(); 
CGImageRef cgimg = CGImageCreateWithImageInRect(cgoriginal, rect);    
UIImage *viewImage = [UIImage imageWithCGImage:cgimg];  
CGImageRelease(cgoriginal);     
CGImageRelease(cgimg); 

Проблема, по которой я еще не нашел исправления, как можно получить изображение камеры очень быстро без каких-либо наложений?

+1

: Я использую ваш код, но все же я получил предварительный просмотр камеры как черный – Seeker

0

по крайней мере пока, нет способа сделать это. (конечно, официального документально не зафиксировано, и, насколько я знаю, никто не выяснил и неофициальный способ).

Данные предварительного просмотра камеры в данный момент отрисовываются ОС, что обходит обычные графические методы.

1

Неофициальный вызов:

UIGetScreenImage() 

который вы объявляете над @implementation как:

extern CGImageRef UIGetScreenImage(); 

Там может быть документированы способ сделать это в 3.1, но я не уверен, , Если нет, пожалуйста, напишите Radar с Apple, прося их сделать доступ к экрану доступа к экрану!

Это использует тот же самый AppleID, с которым вы входите в портал разработки iPhone.

Обновление: этот звонок еще не задокументирован, но Apple явно дала ОК, чтобы использовать его в приложениях App Store.

+0

Как вы используете UIGetScreenImage? в потоке? –

+0

Я не думаю, что вы можете использовать его из потока, я просто вызывал его всякий раз, когда мне хотелось получить содержимое экрана - вы можете взять созданное изображение и отправить его в фоновый поток для обработки. –