iOS 截屏指定区域

article/2025/9/15 10:14:09

转自:链接:https://www.jianshu.com/p/39db0fa66c0e

指定截屏代码实现

全屏截图效果

全屏截图效果

指定区域截屏效果

指定区域截屏效果

这里先上代码,代码后面有相关方法的解释
第一种方法
代码下载

 /**创建一个基于位图的上下文(context),并将其设置为当前上下文(context)@param size 参数size为新创建的位图上下文的大小。它同时是由UIGraphicsGetImageFromCurrentImageContext函数返回的图形大小@param opaque 透明开关,如果图形完全不用透明,设置为YES以优化位图的存储,我们得到的图片背景将会是黑色,使用NO,表示透明,图片背景色正常@param scale 缩放因子 iPhone 4是2.0,其他是1.0。虽然这里可以用[UIScreen mainScreen].scale来获取,但实际上设为0后,系统就会自动设置正确的比例了*/UIGraphicsBeginImageContextWithOptions([[UIScreen mainScreen] bounds].size, YES, 0.0);UIView * view = [[UIScreen mainScreen] snapshotViewAfterScreenUpdates:YES];
//把控制器View的内容绘制到上下文当中.
//layer是不能够直接绘制的.要用渲染的方法才能够让它绘制到上下文当中。UIGraphicsGetCurrentContext()[view.layer renderInContext:UIGraphicsGetCurrentContext()];
//从上下文当中生成一张图片UIImage *viewImage = UIGraphicsGetImageFromCurrentImageContext();
//关闭上下文.UIGraphicsEndImageContext();
/*
//image:要把图片转成二进制流,compressionQuality:可压缩质量.
NSData*data =UIImagePNGRepresentation(viewImage);*///上面我们获得了一个全屏的截图,下边的方法是对这个图片进行裁剪。CGImageRef imageRef =viewImage.CGImage;//这里要特别注意,这里的宽度 CGImageGetWidth(imageRef) 是图片的像素宽(高度同解),所以计算截图区域时需要按比例来;
//这里举的例子是宽高屏幕1/2位置在中心CGRect rect =  CGRectMake(CGImageGetWidth(imageRef)/4, CGImageGetHeight(imageRef)/2-CGImageGetWidth(imageRef)/2, CGImageGetWidth(imageRef)/2, CGImageGetWidth(imageRef)/2);//这里可以设置想要截图的区域CGImageRef imageRefRect =CGImageCreateWithImageInRect(imageRef, rect);UIImage *sendImage =[[UIImage alloc] initWithCGImage:imageRefRect];

第二种方法
代码下载

    //设置边框宽度CGFloat borderWH = 5;//图片宽度(像素)CGFloat imageWH = self.baseImageView.image.size.width;NSLog(@"=========%f",imageWH);//开启一个位图上下文(W = imageWH + 2 * border H = imageWH + 2 * border)CGSize size =CGSizeMake(imageWH + 2*borderWH, imageWH + 2*borderWH);UIGraphicsBeginImageContextWithOptions(size,NO,0);//绘制一个圆形的形状.UIBezierPath*path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(0,0, size.width, size.height)];//边框颜色UIColor *color = [UIColor redColor];[color set];[path fill];//设置一个小圆,并设置成裁剪区域path = [UIBezierPath bezierPathWithOvalInRect:CGRectMake(borderWH, borderWH, imageWH, imageWH)];//把路径设置成裁剪区域[path addClip];//把图片绘制到上下文当中.[self.baseImageView.image drawAtPoint:CGPointMake(borderWH, borderWH)];//从上下文当中生成一张图片UIImage*newImage =UIGraphicsGetImageFromCurrentImageContext();//关闭上下文.UIGraphicsEndImageContext();self.bottonImageView.image = newImage;

相关知识详解

UIGraphicsBeginImageContext创建一个基于位图的上下文(context),并将其设置为当前上下文(context)。方法声明如下:

void UIGraphicsBeginImageContext(CGSize size);

参数size为新创建的位图上下文的大小。它同时是UIGraphicsGetImageFromCurrentImageContext函数返回的图形大小。
该函数的功能同UIGraphicsBeginImageContextWithOptions的功能相同,相当与UIGraphicsBeginImageContextWithOptionsopaque参数为NO,scale因子为1.0。

UIGraphicsBeginImageContextWithOptions函数原型为:

void UIGraphicsBeginImageContextWithOptions(CGSize size, BOOL opaque, CGFloat scale);

size——同UIGraphicsBeginImageContext
opaque—透明开关,如果图形完全不用透明,设置为YES以优化位图的存储。
scale—–缩放因子 iPhone 4是2.0,其他是1.0。虽然这里可以用[UIScreen mainScreen].scale来获取,但实际上设为0后,系统就会自动设置正确的比例了。


其他的截屏方法

第二种
这是在比较常见的截图方法,不过不支持Retina屏幕。

UIGraphicsBeginImageContext(self.view.frame.size);[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];UIImage *image = UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();return image;

第三种
从iPhone 4、iPod Touch 4开始,Apple逐渐采用Retina屏幕,于是在iOS 4的SDK中我们有了,上面的截图方法也自然变成了这样。

  UIGraphicsBeginImageContextWithOptions(self.view.frame.size, NO, 0.0);[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];UIImage *image = UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();return image;

第四种
或许你会说有时Hook的是一个按钮的方法,用第三个方法的话,根本找不到view来传值,不过还好,iOS 7又提供了一些UIScreen的API。

    UIView * view = [[UIScreen mainScreen] snapshotViewAfterScreenUpdates:YES];UIGraphicsBeginImageContextWithOptions(view.frame.size, NO, 0.0);[view.layer renderInContext:UIGraphicsGetCurrentContext()];UIImage *image = UIGraphicsGetImageFromCurrentImageContext();UIGraphicsEndImageContext();return image;

 



作者:山水域
链接:https://www.jianshu.com/p/39db0fa66c0e
来源:简书
简书著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。


http://chatgpt.dhexx.cn/article/n4N4ha0D.shtml

相关文章

windows如何截屏

截屏是我们平时工作或记录常用的操作,不过有人不知道怎么用系统截屏,今天,小编带来了系统的几种截屏,让我们来看看吧! 一、快捷键截图 1. Win shift S:可以选择截图区域的大小,CtrlV粘贴在w…

Android 任意区域截屏

1、全屏截图 Android其实可以做到任意区域截屏,不过我们先来看看整个屏幕截图代码,相信大家很熟悉,代码如下 View decorView activity.getWindow().getDecorView(); decorView.setDrawingCacheEnabled(true); view.buildDrawingCache(); /…

snipaste 固定位置截屏

原文参考: snipaste怎么固定位置截图,如何统一大小截图 一、电脑点击【snipaste】,或者点击键盘的“F1”。 二、在图片,根据自己的需求,画出截图的位置和大小,比如:本篇是500*296。 三、点击右…

JavaScript实现浏览器特定区域截屏和下载功能

JavaScript实现浏览器特定区域截屏功能 需求介绍尝试一:使用Jtopo.js自带的保存图片方法(不能对资源进行下载)尝试二:对saveImageInfo进行改写(功能能用,但是会因为跨域问题污染canvas)&#xf…

Unity中的截图方法(包括全屏截图、区域截图、Camera截图和摄像头截图)

Unity中的截图方法(包括全屏截图、区域截图、Camera截图和摄像头截图) Application.CaptureScreenshotScreenCapture Texture2D.ReadPixels视口截图RenderTexture(Camera截图)WebCamTexture(摄像头截图、照相&#xff…

实现区域截图功能

利用QQ或微信自带的截图功能实现区域截图。 在腾讯安装目录下找到PrScrn.dll,并将它放在需要的位置, 将D:/PrScrn.dll修改为你的目录。 如果在maya里面直接使用该代码 import os,subprocess from PySide2.QtWidgets import QApplication clipboard …

小米手机怎么截屏?小米手机区域截屏

小米手机怎么截屏?手机的截屏其实都是差不多的,基本上都是三指向下滑动而达到截屏效果的,但基本都是全屏截图。小米手机区域截屏怎么做?如果想要做到任意位置的那种区域块截屏的话,该怎么做?下面就来看看吧…

浏览器截图方法(长截图、node截图、指定区域截图)

1.打开需要截屏的页面,按键盘上的F2(或者CtrlShiftI)打开浏览器控制台 2.CtrlshiftP进入搜索框,输入“screen”: 这里有四种截图模式,点击需要的截图方式即可截取图片。

Windows关闭指定端口命令

假设要关闭端口号为3003,使用下面的命令,查出此端口号对应的PID netstat -ano|findstr 3003 上图红框内的 22876 就是3003端口对应的PID,再使用下面的命令就可以关闭这个端口了 taskkill /PID 22876 /F

Linux关闭端口

netstat -anp | grep xxx //查看端口是否被占用kill -9 10762 //即可关闭端口

linux开放端口和关闭端口

centos6: 关闭防火墙:service iptables stop 开启防火墙:service iptables start 防火墙状态:service iptables status 永久关闭:chkconfig iptables off 永久开启:chkconfig iptables on 方法一(命令): 1. 开放端口命令: /sbin/iptables -I INPUT…

[NLP自然语言处理]谷歌BERT模型深度解析

BERT模型代码已经发布,可以在我的github: NLP-BERT--Python3.6-pytorch 中下载,请记得start哦 目录 一、前言 二、如何理解BERT模型 三、BERT模型解析 论文的核心:详解BERT模型架构 关键创新:预训练任务 实验结果 四、BERT模型…

深度学习:BERT模型

BERT模型 BERT出自https://arxiv.org/pdf/1810.04805.pdf的全称是Bidirectional Encoder Representation from Transformers,即双向Transformer的Encoder。作为一个Word2Vec的替代者,其在NLP领域的11个方向大幅刷新了精度,可以说是近年来自残…

BERT模型系列大全解读

前言 本文讲解的BERT系列模型主要是自编码语言模型-AE LM(AutoEncoder Language Model):通过在输入X中随机掩码(mask)一部分单词,然后预训练的主要任务之一就是根据上下文单词来预测这些单词,从…

BERT模型的深度解读

一、BERT整体概要 Bert由两部分组成: 预训练(Pre-training):通过两个联合训练任务得到Bert模型微调(Fine-tune):在预训练得到bert模型的基础上进行各种各样的NLP 二、预训练 输入经过bert encoder层编…

BERT从零详细解读:BERT整体模型架构

基础结构-TRM的Encoder BERT使用多个Encoder堆叠在一起,其中bert base使用的是12层的encoder,bert large使用的是24层的encoder。 对于transformer来说,输入包括两个部分: 一部分是input enbedding,就是做词的词向量…

如何计算Bert模型的参数量

BERT是基于transformer结构的预训练模型。具体bert原理介绍,请参考博客:Bert系列解读及改进_&永恒的星河&的博客-CSDN博客_bert系列 求解Bert模型的参数量是面试常考的问题,也是作为算法工程师必须会的一个点。所谓会用并不代表熟悉…

关于Bert模型参数的分布

参数分布 Bert模型的版本如下: BERT-Base, Uncased: 12-layer, 768-hidden, 12-heads, 110M parameters BERT-Large, Uncased: 24-layer, 1024-hidden, 16-heads, 340M parameters BERT-Base, Cased: 12-layer, 768-hidden, 12-heads , 110M parameters BERT-L…

BERT模型原理的详细介绍

文章目录 参考文章1. BERT模型1.1 模型结构1.2 输入表示1.3 预训练任务1.3.1 Task 1:Masked Language Model1.3.2 Task 2:Next Sentence Prediction 1.4 微调(fine-tuning)基于句子对的分类任务基于单个句子的分类任务问答任务命名实体识别 2. 总结 参考文章 【NLP…

BERT和GPT模型简介

1. 引言 从现在的大趋势来看,使用某种模型预训练一个语言模型看起来是一种比较靠谱的方法。从之前 AI2 的 ELMo,到 OpenAI 的 fine-tune transformer,再到 Google 的 BERT、GPT,全都是对预训练的语言模型的应用。 本文将主要介绍…