iOSでどのようにしてビューのスクリーンショットを取得しますか?
前言
最近SDKのスクリーンショットをしていますが、似たようなシステムのスクリーンショット機能を触発したいです。
UID Viewのcategoryを書いて、これらの方法をカプセル化して簡略化しました。
第一の状況のスクリーンショット
これは最も一般的なスクリーンショットで、一般的なビューにビューを追加する場合には、基本的に使用できます。
ソース:
いくつかのビューがOpenGLで描画されている場合、上の方法でOpenGLにレンダリングされている部分をカットすることはできません。この場合は改善されたスクリーンショットスキームを使用します。
いくつかの特殊なLayer(例えば、AVCapture Video Preview LayerとAVSampleBuffer DisplayLayer)があるViewに追加された後、上のいくつかの方法でLayer上のコンテンツを切り取れません。この時はシステムのAPIが使えますが、このAPIはUID Viewに戻り、UID Viewに戻ります。
方式3で切り取ったUIViewはUImageに変換できません。戻ってきたスクリーンショットViewをビットマップに書き込んでUImageに変換してみましたが、UImageは空か、それともコンテンツがないかを試しました。解決策を知っている人がいたら、教えてください。
UICWebViewのスクリーンショット
去年ブルートゥース印刷をした時、UICWebViewの内容をUImageに変換してみました。UICWebViewのcategoryを書いたことがあります。UID WebViewのスクリーンショットにもなります。ついでに貼ってください。
以上はこの文章の全部の内容です。本文の内容は皆さんの学習や仕事に対して一定の参考学習価値を持ってほしいです。ありがとうございます。
最近SDKのスクリーンショットをしていますが、似たようなシステムのスクリーンショット機能を触発したいです。
UID Viewのcategoryを書いて、これらの方法をカプセル化して簡略化しました。
第一の状況のスクリーンショット
これは最も一般的なスクリーンショットで、一般的なビューにビューを追加する場合には、基本的に使用できます。
ソース:
/**
API layer OpenGL
@return
*/
- (UIImage *)nomalSnapshotImage
{
UIGraphicsBeginImageContextWithOptions(self.frame.size, NO, [UIScreen mainScreen].scale);
[self.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *snapshotImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return snapshotImage;
}
第二の状況のスクリーンショットいくつかのビューがOpenGLで描画されている場合、上の方法でOpenGLにレンダリングされている部分をカットすることはできません。この場合は改善されたスクリーンショットスキームを使用します。
/**
OpenGL
@return
*/
- (UIImage *)openglSnapshotImage
{
CGSize size = self.bounds.size;
UIGraphicsBeginImageContextWithOptions(size, NO, [UIScreen mainScreen].scale);
CGRect rect = self.frame;
[self drawViewHierarchyInRect:rect afterScreenUpdates:YES];
UIImage *snapshotImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return snapshotImage;
}
第三の状況のスクリーンショットいくつかの特殊なLayer(例えば、AVCapture Video Preview LayerとAVSampleBuffer DisplayLayer)があるViewに追加された後、上のいくつかの方法でLayer上のコンテンツを切り取れません。この時はシステムのAPIが使えますが、このAPIはUID Viewに戻り、UID Viewに戻ります。
/**
UIView (_UIReplicantView)
@return
*/
- (UIView *)snapshotView
{
UIView *snapView = [self snapshotViewAfterScreenUpdates:YES];
return snapView;
}
問題を残す:方式3で切り取ったUIViewはUImageに変換できません。戻ってきたスクリーンショットViewをビットマップに書き込んでUImageに変換してみましたが、UImageは空か、それともコンテンツがないかを試しました。解決策を知っている人がいたら、教えてください。
UICWebViewのスクリーンショット
去年ブルートゥース印刷をした時、UICWebViewの内容をUImageに変換してみました。UICWebViewのcategoryを書いたことがあります。UID WebViewのスクリーンショットにもなります。ついでに貼ってください。
- (UIImage *)imageForWebView
{
// 1. WebView
CGSize boundsSize = self.bounds.size;
CGFloat boundsWidth = boundsSize.width;
CGFloat boundsHeight = boundsSize.height;
// 2. contentSize
CGSize contentSize = self.scrollView.contentSize;
CGFloat contentHeight = contentSize.height;
// 3. ,
CGPoint offset = self.scrollView.contentOffset;
// 4. (0,0);
[self.scrollView setContentOffset:CGPointMake(0, 0)];
NSMutableArray *images = [NSMutableArray array];
while (contentHeight > 0) {
// 5. CGContext 5. CGContext
UIGraphicsBeginImageContextWithOptions(boundsSize, NO, 0.0);
CGContextRef ctx = UIGraphicsGetCurrentContext();
// 6.
[self.layer renderInContext:ctx];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
// 7.
[images addObject:image];
CGFloat offsetY = self.scrollView.contentOffset.y;
[self.scrollView setContentOffset:CGPointMake(0, offsetY + boundsHeight)];
contentHeight -= boundsHeight;
}
// 8 webView
[self.scrollView setContentOffset:offset];
CGFloat scale = [UIScreen mainScreen].scale;
CGSize imageSize = CGSizeMake(contentSize.width * scale,
contentSize.height * scale);
// 9. 、
UIGraphicsBeginImageContext(imageSize);
[images enumerateObjectsUsingBlock:^(UIImage *image, NSUInteger idx, BOOL *stop) {
[image drawInRect:CGRectMake(0,scale * boundsHeight * idx,scale * boundsWidth,scale * boundsHeight)];
}];
UIImage *fullImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return fullImage;
}
締め括りをつける以上はこの文章の全部の内容です。本文の内容は皆さんの学習や仕事に対して一定の参考学習価値を持ってほしいです。ありがとうございます。