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

Помимо комментариев в коде есть еще несколько вещей, о которых следует знать:

  1. "Область", которую вы обрезаете, всегда будет соответствовать "изображению", которое вы обрезаете. Итак, если вы хотите обрезать {150,50} от изображения, и происхождение изображения в {20,20} тогда это будет выглядеть как вы обрезка {170,70} из холста.

  2. C4Image объект на самом деле имеет renderInContext: метод, так что вам не нужно делать это со слоя изображения.

  3. 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];
Другие вопросы по тегам