2012-01-02 31 views
16

Giống như bạn có thể thấy trong mã của tôi, tôi chụp ảnh màn hình và lưu nó vào album ảnh.Lập trình có ảnh chụp màn hình của khu vực cụ thể

//for retina displays 
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) { 
    UIGraphicsBeginImageContextWithOptions(self.view.bounds.size, NO, [UIScreen mainScreen].scale); 
} else { 
    UIGraphicsBeginImageContext(self.view.bounds.size); 
} 
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
UIImageWriteToSavedPhotosAlbum(viewImage, nil, nil, nil); 

Lúc đầu tôi sử dụng webview.size thay vì self.view.bounds.size và nó đã hoạt động bình thường vì xem được tọa lạc tại 0/0. Nhưng bây giờ tôi tập trung vào WebView nhưng các hình ảnh được bắt đầu tại 0/0 cho kích thước nhất định.

Làm cách nào tôi có thể định cấu hình ảnh chụp màn hình bắt đầu từ một số khác location (ví dụ: 300/150) cho kích thước đã cho?

Hoặc có cách nào khác để chụp ảnh một số UIWebView không?

+0

Tính năng này có hoạt động trên OSX hoặc chỉ cần iPhone? – Noitidart

Trả lời

2

tôi giải quyết vấn đề của tôi, nhưng không trả lời câu hỏi:

Tôi tạo ra một lớp con của UIView và di chuyển của tôi UIWebView trong đó, vì vậy rằng nó có vị trí 0/0 so với lớp con. Sau đó, sử dụng kích thước của WebView:

UIGraphicsBeginImageContext(webview.frame.size); 

và mã khác từ trên cao.

Bây giờ bạn có thể di chuyển lớp con đến mọi vị trí bạn muốn.

Lưu ý: Nếu bạn có nhãn như nhãn ngày/giờ, bạn phải di chuyển chúng hoặc bạn sẽ không thấy chúng trên ảnh.

Vì vậy, tạo một lớp con của UIView và di chuyển mỗi IBOutlet bạn muốn trở thành nhìn thấy trên hình ảnh trong đó.

Câu hỏi vẫn mở: Vì vậy, bạn có thể chụp ảnh một khu vực cụ thể của màn hình?

Trân trọng. $ H @ rky

0
- (void)drawRect:(CGRect)rect { 
    UIGraphicsBeginImageContext(self.bounds.size);  
    [self.view.layer renderInContext:UIGraphicsGetCurrentContext()]; 
    UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 
    UIImageWriteToSavedPhotosAlbum(viewImage, nil, nil, nil); 
} 

Bạn có thể gọi đây là quan điểm của mình:]

+0

Phương thức drawRect được gọi khi chế độ xem web được tạo - vì vậy tôi có một pic màu xám ở đầu. Ý tưởng mà tôi nhận được từ việc này là kéo mã và thả nó vào lớp UIView tùy chỉnh của tôi nơi chế độ xem web của tôi được đặt ở 0/0. Thats làm việc nhưng tôi không thấy nhãn nữa vì nó là một phần của "root view". – Sharky

23

Bạn cần phải thực hiện hai thay đổi để chỉ lấy một phần của màn hình:

  1. Tạo một hình ảnh nhỏ hơn - sử dụng kích thước của rect bạn muốn chụp.
  2. Di chuyển xuất xứ của ngữ cảnh mà bạn đang hiển thị thành âm x/y của quảng cáo bạn muốn chụp.

Sau đó, bạn chỉ cần đưa lớp vào ngữ cảnh như bạn đang làm và bạn sẽ nhận được những gì bạn đang tìm kiếm. Một cái gì đó như thế này nên làm điều đó:

CGRect grabRect = CGRectMake(40,40,300,200); 

//for retina displays 
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) { 
    UIGraphicsBeginImageContextWithOptions(grabRect.size, NO, [UIScreen mainScreen].scale); 
} else { 
    UIGraphicsBeginImageContext(grabRect.size); 
} 
CGContextRef ctx = UIGraphicsGetCurrentContext(); 
CGContextTranslateCTM(ctx, -grabRect.origin.x, -grabRect.origin.y); 
[self.view.layer renderInContext:ctx]; 
UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext(); 
UIImageWriteToSavedPhotosAlbum(viewImage, nil, nil, nil); 
+0

Điều này làm hỏng ứng dụng của tôi. Bất kỳ ý tưởng tại sao? Tôi đã thêm khuôn khổ QuartzCore và đặt mã này trong một hàm, nhưng vẫn không đi. –

+0

@rebellion - Tôi đã làm việc này. Mặc dù không có trong album ảnh. Xem thích ứng của tôi dưới đây như là một phương pháp thể loại UIView. – idStar

+0

Cảm ơn, điều này làm việc tuyệt vời cho tôi. Chỉ một chút vấn đề màu nền của hình ảnh là màu trắng, tôi muốn nó trong suốt. Làm thế nào tôi có thể làm điều đó. Vui lòng giúp – iMemon

10

Tôi đã thực hiện và kiểm tra câu trả lời của @ escrafford ở trên, và làm cho nó hoạt động tốt. Tôi đã thử nghiệm nó trong bối cảnh làm cho nó một phương pháp thể loại trên UIView, để 'grabRect' có thể được paramaterized.Dưới đây là mã, dưới dạng danh mục UIView trả lại cho bạn UIImageView:

/** 
Takes a screenshot of a UIView at a specific point and size, as denoted by 
the provided croppingRect parameter. Returns a UIImageView of this cropped 
region. 

CREDIT: This is based on @escrafford's answer at http://stackoverflow.com/a/15304222/535054 
*/ 
- (UIImageView *)rp_screenshotImageViewWithCroppingRect:(CGRect)croppingRect { 
    // For dealing with Retina displays as well as non-Retina, we need to check 
    // the scale factor, if it is available. Note that we use the size of teh cropping Rect 
    // passed in, and not the size of the view we are taking a screenshot of. 
    if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) { 
     UIGraphicsBeginImageContextWithOptions(croppingRect.size, YES, [UIScreen mainScreen].scale); 
    } else { 
     UIGraphicsBeginImageContext(croppingRect.size); 
    } 

    // Create a graphics context and translate it the view we want to crop so 
    // that even in grabbing (0,0), that origin point now represents the actual 
    // cropping origin desired: 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    CGContextTranslateCTM(ctx, -croppingRect.origin.x, -croppingRect.origin.y); 
    [self.layer renderInContext:ctx]; 

    // Retrieve a UIImage from the current image context: 
    UIImage *snapshotImage = UIGraphicsGetImageFromCurrentImageContext(); 
    UIGraphicsEndImageContext(); 

    // Return the image in a UIImageView: 
    return [[UIImageView alloc] initWithImage:snapshotImage]; 
} 
+0

Mã này là tất nhiên, giả sử ARC và hiện tại (một giải pháp làm việc) như tại iOS6.1. – idStar

+1

giải pháp tuyệt vời! cảm ơn! – MaKo

Các vấn đề liên quan