IOS Скриншот части экрана
У меня есть приложение, которое снимает снимок экрана UIImageView со следующим кодом:
-(IBAction) screenShot: (id) sender{
UIGraphicsBeginImageContext(sshot.frame.size);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageWriteToSavedPhotosAlbum(viewImage,nil, nil, nil);
}
Это хорошо работает, но мне нужно иметь возможность позиционировать, где я снимаю снимок экрана, в основном мне нужно пропустить только треть экрана (центральная часть). Я попытался использовать
UIGraphicsBeginImageContext(CGSize 150,150);
Но обнаружили, что каждая вещь взята из координат 0,0, имеет ли кто-нибудь идею, как правильно позиционировать ее.
Ответы
Ответ 1
Ну, снимок экрана взят из холста, который вы рисуете.
Поэтому вместо рисования слоя во всем контексте со ссылкой на верхний левый угол вы нарисуете его, где хотите снять снимок экрана.
//first we will make an UIImage from your view
UIGraphicsBeginImageContext(self.view.bounds.size);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *sourceImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
//now we will position the image, X/Y away from top left corner to get the portion we want
UIGraphicsBeginImageContext(sshot.frame.size);
[sourceImage drawAtPoint:CGPointMake(-50, -100)];
UIImage *croppedImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageWriteToSavedPhotosAlbum(croppedImage,nil, nil, nil);
Ответ 2
От
UIGraphicsBeginImageContext(sshot.frame.size);
CGContextRef c = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(c, 150, 150); // <-- shift everything up to required position when drawing.
[self.view.layer renderInContext:c];
UIImage* viewImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
UIImageWriteToSavedPhotosAlbum(viewImage, nil, nil, nil);
Ответ 3
Используйте этот метод для обрезки, если у вас есть изображение с четким прямоугольником для обрезки:
-(UIImage *)cropImage:(UIImage *)image rect:(CGRect)cropRect
{
CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], cropRect);
UIImage *img = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
return img;
}
Используйте это:
UIImage *img = [self cropImage:viewImage rect:CGRectMake(150,150,100,100)]; //example
Ответ 4
Если вам нравится, вы можете ссылаться на этот код.
В этом примере вы можете получить изображение, покрываемое прямоугольником, из любой позиции и любого масштаба масштабирования.
Счастливое кодирование:)
Некоторые извлеченные коды для ссылки ниже
Основная функция или код, используемый для обрезки фотографии
- (UIImage *) croppedPhoto
{
CGFloat ox = self.scrollView.contentOffset.x;
CGFloat oy = self.scrollView.contentOffset.y;
CGFloat zoomScale = self.scrollView.zoomScale;
CGFloat cx = (ox + self.cropRectangleButton.frame.origin.x + 15.0f) * 2.0f / zoomScale;
CGFloat cy = (oy + self.cropRectangleButton.frame.origin.y + 15.0f) * 2.0f / zoomScale;
CGFloat cw = 300.0f / zoomScale;
CGFloat ch = 300.0f / zoomScale;
CGRect cropRect = CGRectMake(cx, cy, cw, ch);
NSLog(@"---------- cropRect: %@", NSStringFromCGRect(cropRect));
NSLog(@"--- self.photo.size: %@", NSStringFromCGSize(self.photo.size));
CGImageRef imageRef = CGImageCreateWithImageInRect([self.photo CGImage], cropRect);
UIImage *result = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
NSLog(@"------- result.size: %@", NSStringFromCGSize(result.size));
return result;
}
Подробности использования примера даны здесь.
Наслаждайтесь кодированием:)