C4 сохранение части изображения
Привет, я прошел пример для сохранения изображений, а потом я хотел сохранить только часть экрана. Мне удалось сохранить часть, начиная с верхнего левого угла изображения, но я действительно хочу сохранить центр моего экрана. Магия сохранения только части изображения заключается в настройке графического контекста определенного размера, например:
UIGraphicsBeginImageContextWithOptions(CGSizeMake(300, 300), YES, 5.0f);
Я думал, что может быть способ использовать CGRect вместо размера, но это дает мне ошибку. любые другие попытки или мысли? Нужно ли мне просматривать пиксели моего скриншота, брать те, которые нужны, и создавать из них новое изображение (это был бы сложный способ, о котором я могу думать, но, может быть, есть и более простой)?
3 ответа
Чтобы сделать это с объектами C4Image, вы можете изменить ответ incmiko так, чтобы он выглядел следующим образом:
#import "C4Workspace.h"
@implementation C4WorkSpace{
C4Image *image;
C4Image *croppedImage;
}
-(void)setup {
image=[C4Image imageNamed:@"C4Sky.png"];
image.origin=CGPointMake(0, 20);
croppedImage = [self cropImage:image toArea:CGRectMake(150,50,100,100)];
croppedImage.origin = CGPointMake(20, 360);
[self.canvas addObjects:@[image,croppedImage]];
}
-(C4Image *)cropImage:(C4Image *)originalImage toArea:(CGRect)rect{
//grab the image scale
CGFloat scale = originalImage.UIImage.scale;
//begin an image context
UIGraphicsBeginImageContextWithOptions(rect.size, NO, scale);
//create a new context ref
CGContextRef c = UIGraphicsGetCurrentContext();
//shift BACKWARDS in both directions because this moves the image
//the area to crop shifts INTO: (0, 0, rect.size.width, rect.size.height)
CGContextTranslateCTM(c, -rect.origin.x, -rect.origin.y);
//render the original image into the context
[originalImage renderInContext:c];
//grab a UIImage from the context
UIImage *newUIImage = UIGraphicsGetImageFromCurrentImageContext();
//end the image context
UIGraphicsEndImageContext();
//create a new C4Image
C4Image *newImage = [C4Image imageWithUIImage:newUIImage];
//return the new image
return newImage;
}
@end
Помимо комментариев в коде есть еще несколько вещей, о которых следует знать:
"Область", которую вы обрезаете, всегда будет соответствовать "изображению", которое вы обрезаете. Итак, если вы хотите обрезать
{150,50}
от изображения, и происхождение изображения в{20,20}
тогда это будет выглядеть как вы обрезка{170,70}
из холста.C4Image
объект на самом деле имеетrenderInContext:
метод, так что вам не нужно делать это со слоя изображения.C4Image
обертывание объектовUIImage
объекты, поэтому мы строим новый, используяUIImage
что мы получаем из текущего контекста
Небольшая модификация ответа Трэвиса делает его независимым от изображения, но зависит от происхождения холста:
-(C4Image *)cropImage:(C4Image *)originalImage withOrigin:(CGPoint)origin toArea:(CGRect)rect{
//grab the image scale
CGFloat scale = originalImage.UIImage.scale;
//begin an image context
UIGraphicsBeginImageContextWithOptions(rect.size, NO, scale);
//create a new context ref
CGContextRef c = UIGraphicsGetCurrentContext();
//shift BACKWARDS in both directions because this moves the image
//the area to crop shifts INTO: (0, 0, rect.size.width, rect.size.height)
CGContextTranslateCTM(c, origin.x-rect.origin.x, origin.y-rect.origin.y);
//render the original image into the context
[originalImage renderInContext:c];
//grab a UIImage from the context
UIImage *newUIImage = UIGraphicsGetImageFromCurrentImageContext();
//end the image context
UIGraphicsEndImageContext();
//create a new C4Image
C4Image *newImage = [C4Image imageWithUIImage:newUIImage];
//return the new image
return newImage;
}
Этот метод, который я написал для этого, прекрасно работает:
+ (UIImage*) getTheArea:(CGRect)area inView:(UIView*)view{
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)])
UIGraphicsBeginImageContextWithOptions(CGSizeMake(area.size.width, area.size.height), NO, [UIScreen mainScreen].scale);
else
UIGraphicsBeginImageContext(view.bounds.size);
CGContextRef c = UIGraphicsGetCurrentContext();
CGContextTranslateCTM(c, -area.origin.x, -area.origin.y); // <-- shift everything up by 40px when drawing.
[view.layer renderInContext:c];
UIImage* thePrintScreen = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return thePrintScreen;
}
например, если вы хотите сделать экран печати своего основного вида, в (100,50,100,100)
UIImage* image = [self getTheArea:CGRectMake(100,50,100,100) inView:view];