12

次のコードでUIImageViewのスクリーンショットを撮るアプリがあります。

-(IBAction) screenShot: (id) sender{

 UIGraphicsBeginImageContext(sshot.frame.size);
 [self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
 UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
 UIGraphicsEndImageContext();
 UIImageWriteToSavedPhotosAlbum(viewImage,nil, nil, nil);


}

これはうまく機能しますが、スクリーンショットを撮る場所に配置できる必要があります。基本的には、画面の3分の1(中央部分)だけをグレーディングする必要があります。使ってみました

UIGraphicsBeginImageContext(CGSize 150,150);

しかし、すべてのものが0,0座標から取得されていることがわかり、これを正しく配置する方法を誰かが知っています。

4

4 に答える 4

30

さて、スクリーンショットはあなたが描いたキャンバスから取られています。したがって、左上隅を参照して、コンテキスト全体でレイヤーを描画する代わりに、スクリーンショットを撮りたい場所にレイヤーを描画します。

//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);
于 2012-10-02T09:45:07.583 に答える
14

これから_

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);
于 2012-10-02T09:45:33.057 に答える
7

トリミングする特定の長方形の画像がある場合は、この方法を使用してトリミングします。

-(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
于 2012-10-02T09:57:16.180 に答える
0

必要に応じて、このコードを参照できます。

この例では、任意の位置と任意のズームスケールからrectで覆われた画像を取得できます。

ハッピーコーディング:)

参照用に抽出されたコードは次のとおりです

写真のトリミングに使用される主な機能またはコード

- (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;
}

例の使用方法の詳細は、ここに記載されています。

コーディングをお楽しみください:)

于 2012-10-02T11:25:19.773 に答える