web-dev-qa-db-ja.com

iOSで画像をトリミングする方法

1つのセクションにステッカーを追加できる写真アプリがあります。完了したら、画像を保存します。ここに私がそれをしなければならないコードがあります。

if(UIGraphicsBeginImageContextWithOptions != NULL)
{
    UIGraphicsBeginImageContextWithOptions(self.view.frame.size, YES, 2.5);
} else {
    UIGraphicsBeginImageContext(self.view.frame.size);
}
CGContextRef contextNew=UIGraphicsGetCurrentContext();

[self.view.layer renderInContext:contextNew];

UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

UIGraphicsEndImageContext();

保存される画像は画像の全画面です。これで問題ありませんが、画像をトリミングする必要があり、方法がわかりません。画像は以下のリンクで確認できます。 http://dl.dropbox.com/u/19130454/Photo%202012-04-09%201%2036%2018%20PM.png

トリミングする必要があります:左から91ピクセル、右から220ピクセル

どんな助けでも大歓迎です。はっきりと説明していない場合はお知らせください。できる限り説明させていただきます。

27
flite3

このようなものはどうですか

CGRect clippedRect  = CGRectMake(self.view.frame.Origin.x+91, self.view.frame.Origin.y, self.view.frame.size.width-91*2, self.view.frame.size.height-220);
CGImageRef imageRef = CGImageCreateWithImageInRect([image CGImage], clippedRect);
UIImage *newImage   = [UIImage imageWithCGImage:imageRef];
CGImageRelease(imageRef);
34
lukasz

次のコードが役立つ場合があります。

あなたは以下の方法で正しいcropFrame拳を取得する必要があります

-(CGRect)cropRectForFrame:(CGRect)frame
{
    // NSAssert(self.contentMode == UIViewContentModeScaleAspectFit, @"content mode must be aspect fit");

    CGFloat widthScale = imageview.superview.bounds.size.width / imageview.image.size.width;
    CGFloat heightScale = imageview.superview.bounds.size.height / imageview.image.size.height;

    float x, y, w, h, offset;
    if (widthScale<heightScale) {
        offset = (imageview.superview.bounds.size.height - (imageview.image.size.height*widthScale))/2;
        x = frame.Origin.x / widthScale;
        y = (frame.Origin.y-offset) / widthScale;
        w = frame.size.width / widthScale;
        h = frame.size.height / widthScale;
    } else {
        offset = (imageview.superview.bounds.size.width - (imageview.image.size.width*heightScale))/2;
        x = (frame.Origin.x-offset) / heightScale;
        y = frame.Origin.y / heightScale;
        w = frame.size.width / heightScale;
        h = frame.size.height / heightScale;
    }
    return CGRectMake(x, y, w, h);
}

次に、このメソッドを呼び出してトリミングされた画像を取得する必要があります

- (UIImage *)imageByCropping:(UIImage *)image toRect:(CGRect)rect
{
    // you need to update scaling factor value if deice is not retina display
    UIGraphicsBeginImageContextWithOptions(rect.size,
                                           /* your view opaque */ NO,
                                           /* scaling factor */ 2.0);

    // stick to methods on UIImage so that orientation etc. are automatically
    // dealt with for us
    [image drawAtPoint:CGPointMake(-rect.Origin.x, -rect.Origin.y)];

    UIImage *result = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return result;
}
3
iOS_Binod
- (UIImage*)imageByCropping:(CGRect)rect
{
    //create a context to do our clipping in
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef currentContext = UIGraphicsGetCurrentContext();

    //create a rect with the size we want to crop the image to
    //the X and Y here are zero so we start at the beginning of our
    //newly created context
    CGRect clippedRect = CGRectMake(0, 0, rect.size.width, rect.size.height);
    CGContextClipToRect( currentContext, clippedRect);

    //create a rect equivalent to the full size of the image
    //offset the rect by the X and Y we want to start the crop
    //from in order to cut off anything before them
    CGRect drawRect = CGRectMake(rect.Origin.x * -1,
                                 rect.Origin.y * -1,
                                 self.size.width,
                                 self.size.height);

    //draw the image to our clipped context using our offset rect
    // CGContextDrawImage(currentContext, drawRect, self.CGImage);
    [self drawInRect:drawRect]; // This will fix getting inverted image from context.

    //pull the image from our cropped context
    UIImage *cropped = UIGraphicsGetImageFromCurrentImageContext();

    //pop the context to get back to the default
    UIGraphicsEndImageContext();

    //Note: this is autoreleased
    return cropped;
}
1
Mohit