Как сделать снимок экрана для всего экрана, независимо от того, какое приложение находится на переднем плане в iOS 7 (Jailbroken)

До iOS7 я использовал функцию UIGetScreenImage(), чтобы легко сделать снимок экрана, но в iOS7 она устарела, теперь есть какие-нибудь хорошие способы заархивировать это? Спасибо!

Дополнение: мне нужно сделать снимок экрана на весь экран при любом просмотре.


person Suge    schedule 07.02.2014    source источник
comment
Думаю, это может помочь: stackoverflow .com / questions / 18956611 /.   -  person P. Sami    schedule 07.02.2014
comment
@ P.Sami, @ SamkitJain, спасибо за ваш ответ, но это не может решить проблему для меня, мое приложение - это приложение для настройки взлома, работающее внутри SpringBoard, я хочу сделать снимок экрана при любом просмотре любого приложения вверху, включая домашний экран, а не только просмотры моего приложения. Что я могу сделать?   -  person Suge    schedule 08.02.2014
comment
@Suge вы посмотрите на повторяющийся вопрос и прочтите ответы на него. Джейлбрейк - это не черная магия (ну ...), твики имеют доступ к тем же API, что и официальные приложения.   -  person    schedule 11.02.2014
comment
@ H2CO3, моя настройка выполняется внутри SpringBoard, вы имеете в виду, что я могу использовать метод snapshotViewAfterScreenUpdates, чтобы сделать снимок экрана для всего экрана всякий раз, когда какое приложение находится на переднем плане? Но как я могу получить обзор спереди?   -  person Suge    schedule 11.02.2014
comment
@Suge Ты сам снимок [UIWindow mainWindow].   -  person    schedule 11.02.2014
comment
@ H2CO3, используйте [UIWindow mainWindow] Я могу получить только вид SpringBoard, а не самое переднее приложение.   -  person Suge    schedule 12.02.2014
comment
Вы можете использовать следующие способы: [введите описание ссылки здесь] [1] [введите описание ссылки здесь] [2] [1]: stackoverflow.com/questions/3610604/ [2]: stackoverflow.com/ questions / 18679787 /   -  person Alexander Merchi    schedule 13.02.2014


Ответы (4)


Я столкнулся с той же проблемой, но не знаю, как ее решить.

Я попробовал ​​IOSurface - IOS Private API - Сделать снимок экрана в фоновом режиме , который хорошо работает в некоторых приложениях, но возвращает черный экран в играх.

Затем я попробовал это приложение https://github.com/k06a/UIView-FastScreenshot/blob/master/UIView%2BFastScreenshot.m, который хорошо работает с частным API, но я не могу скомпилировать его с помощью theos, всегда сообщая мне «Неопределенные символы для архитектуры armv7: CARenderServerRenderDisplay». Изменить: я понял, как скомпилировать его с помощью theos, но возвращает пустое изображение.

Кроме того, https://github.com/coolstar/RecordMyScreen хорошо работает в iOS7, но не открывается. источник сейчас, поэтому я не могу понять, как он захватывает весь экран.

Изменить: код RecordMyScreen работает на iOS7 как настройка трамплина, вы можете обратиться к этому файлу https://github.com/coolstar/RecordMyScreen/blob/master/RecordMyScreen/CSScreenRecorder.m этот метод" - (void) _captureShot: (CMTime) frameTime; "

person cloudycliff    schedule 09.02.2014
comment
Спасибо за ответ, RecordMyScreen исходный код сейчас открыт? Код выглядит старым. - person Suge; 12.02.2014
comment
RecordMyScreen сейчас не является открытым исходным кодом, но после некоторой обратной инженерии с последней версией код для захвата снимка экрана, похоже, не сильно изменился. Также вы можете обратиться к этой вилке github.com/Norod/RecordMyScreen, которая работает на iOS7. - person cloudycliff; 12.02.2014
comment
Я загрузил свой твик github.com/cloudycliff/CaptureMyScreen, при активации он сохранит снимок экрана в / var /mobile/Documents/test.png - person cloudycliff; 13.02.2014
comment
@tesmojones код активируется Активатором, вы можете установить его в Настройках. Или вы можете просто добавить код захвата в свой твик. - person cloudycliff; 10.04.2014
comment
В версии Norod он продолжал вылетать с предупреждением о полученной памяти. после того, как он вернулся из фона, чтобы я мог остановить запись. На данный момент не было других запущенных приложений. Любые идеи? - person EmilyJ; 09.06.2014

Альтернативный способ заменить UIGetScreenImage ()

CGImageRef screen = UIGetScreenImage();

Приведенный выше код представляет собой одну строку кода для захвата экрана, но Apple не открывает указанный выше API UIGetScreenImage () для общедоступного приложения. т.е. не удалось загрузить в Apple для утверждения. Таким образом, альтернативные способы сделать снимок экрана и сохранить его перечислены ниже.

- (void)captureAndSaveImage
{    

    // Capture screen here... and cut the appropriate size for saving and uploading
    UIGraphicsBeginImageContext(self.view.bounds.size);
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    // crop the area you want 
    CGRect rect;
    rect = CGRectMake(0, 10, 300, 300);    // whatever you want
    CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], rect);
    UIImage *img = [UIImage imageWithCGImage:imageRef]; 
    CGImageRelease(imageRef);
    UIImageWriteToSavedPhotosAlbum(img, self, @selector(image:didFinishSavingWithError:contextInfo:), nil);
    imageView.image = img; // show cropped image on the ImageView     
}

// this is option to alert the image saving status
- (void)image:(UIImage *)image didFinishSavingWithError:(NSError *)error contextInfo:(void *)contextInfo
{
    UIAlertView *alert;

    // Unable to save the image  
    if (error)
        alert = [[UIAlertView alloc] initWithTitle:@"Error" 
                                           message:@"Unable to save image to Photo Album." 
                                          delegate:self cancelButtonTitle:@"Dismiss" 
                                 otherButtonTitles:nil];
    else // All is well
        alert = [[UIAlertView alloc] initWithTitle:@"Success" 
                                           message:@"Image saved to Photo Album." 
                                          delegate:self cancelButtonTitle:@"Ok" 
                                 otherButtonTitles:nil];
    [alert show];
    [alert release];
}

некоторые ссылки помогут вам как-легально-заменить-uigetscreenimage

person codercat    schedule 13.02.2014

UIGraphicsBeginImageContext(self.view.bounds.size);
[self.view renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

Этот код может помочь вам получить снимок экрана self.view, который занимает весь экран iPhone независимо от того, какое приложение находится впереди. слоев в вашем представлении, то слои не будут включены в снимок экрана, и для этого вам необходимо использовать self.view.layer.

person Yieshu    schedule 13.02.2014

У класса UIView есть метод, называемый: resizableSnapshotViewFromRect: afterScreenUpdates: withCapInsets.

Но я никогда не работал с этим методом, поэтому не могу рассказать о нем больше.

И этот пост: Захватить UIView как UIImage показывает, как получить возвращенный UIView в изображение.

надеюсь, что это полезно.

person Mirko Brunner    schedule 07.02.2014
comment
Или лучше воспользуйтесь ответом Samkit Jain;) - person Mirko Brunner; 07.02.2014
comment
спасибо за ваш ответ, но это не может решить проблему для меня, мое приложение - это приложение для настройки джейлбрейка, работающее внутри SpringBoard, я хочу сделать снимок экрана при любом представлении любого приложения вверху, включая домашний экран, а не только представления моего приложения. Что я могу сделать? - person Suge; 08.02.2014