1.?线剪?????Դ??
2.Linux文件系统制作与裁剪
3.UGUI源码阅读之Mask
4.图像裁剪的终极指南:使用Python和Tkinter实现自定义裁剪
5.在线CAD(H5 WEB CAD)中根据图框拆分DWG图纸和转成pdf打印
6.FFMPEG编译裁剪移植
??????Դ??
Cesium是一款全球领先的JavaScript开源产品,专为构建高质量三维地球与地图的裁源Web应用而设计。借助Cesium提供的码线JavaScript开发包,开发者能轻松创建无需插件的剪裁虚拟地球应用,且确保在性能、源码用精度、线剪医美 小程序源码渲染质量以及多平台兼容性与易用性方面达到高标准。裁源
探讨裁剪功能,码线这一概念在图像处理领域并不陌生。剪裁在三维场景中,源码用Cesium能够实现类似PS中的线剪裁剪效果,即动态调整视图区域,裁源突出展示用户感兴趣的码线三维模型部分。本文重点介绍如何基于3dtiles模型实现这一功能。剪裁
实现动态裁剪模型效果,源码用需要遵循以下步骤:
1. 初始化地球模型,并启用深度测试功能,确保场景中的元素正确排序,提升视觉效果。
2. 创建一个切面平面对象,用以定义裁剪区域的边界。
3. 加载3dtiles模型,并将裁剪平面应用到模型上,实现动态调整视图区域的功能。
对于想要实践这一效果的开发者,我们提供了源码下载。只需点击下方链接,即可获取实现动态裁剪模型功能所需的Cesium源码。
Linux文件系统制作与裁剪
操作系统是一种关键的计算机程序,它负责管理和配置硬件与软件资源,如内存管理、优先级设定、输入输出设备控制、网络管理以及文件系统操作,并提供用户界面。然而,通常的Linux操作系统内核包含了广泛硬件支持的多个功能模块和全面的软件服务,这可能导致系统资源占用过高和性能下降。完美麻将源码因此,针对特定应用和硬件环境,需要对操作系统进行裁剪,尤其是内核和文件系统。
内核裁剪通常采用三种方法:一是利用内核配置工具,如make menuconfig,根据系统平台和应用需求定制化内核,删除不必要的模块;二是直接修改内核源码,通过条件编译语句实现更精细的裁剪;三是基于系统调用关系,精准地裁剪不需要的内核函数。文件系统裁剪则着重于删除无用的文件和配置,以构建最精简的运行环境。
构建文件系统有两种常见方式:一是使用生成工具如Busybox或官方最小文件系统;二是基于Ubuntu base镜像。以Busybox为例,制作rootfs时需补充配置文件,如Inittab和fstab,以确保系统启动和文件系统挂载。选择文件系统类型时,需考虑硬件特性、内核支持以及系统性能需求。
对于嵌入式系统,由于硬件和应用需求明确,内核和文件系统裁剪尤为重要,能够定制出最适合的运行环境。例如,使用官方的base镜像制作文件系统时,需对用户创建、网络设置等进行配置,以构建满足特定需求的最小化文件系统。
UGUI源码阅读之Mask
Mask主要基于模版测试来进行裁剪,因此先来了解一下unity中的模版测试。
Unity Shader中的模版测试配置代码大致如上
模版测试的伪代码大概如上
传统的渲染管线中,模版测试和深度测试一般发生在片元着色器(Fragment Shader)之后,但是现在又出现了Early Fragment Test,可以在片元着色器之前进行。
Mask直接继承了UIBehaviour类,同时继承了ICanvasRaycastFilter和IMaterialModifier接口。食品销售源码
Mask主要通过GetModifiedMaterial修改graphic的Material。大致流程:
1.获取当前Mask的层stencilDepth
2.StencilMaterial.Add修改baseMaterial的模板测试相关配置,并将其缓存
3.StencilMaterial.Add设置一个unmaskMaterial,用于最后将模板值还原
MaskableGraphic通过MaskUtilities.GetStencilDepth计算父节点的Mask层数,然后StencilMaterial.Add修改模板测试的配置。
通过Frame Debugger看看具体每个batch都做了什么。先看第一个,是Mask1的m_MaskMaterial,关注Stencil相关的数值,白色圆内的stencil buffer的值设置为1
这个是Mask2的m_MaskMaterial,根据stencil的计算公式,Ref & ReadMask=1,Comp=Equal,只有stencil buffer & ReadMask=1的像素可以通过模板测试,即第一个白色圆内的像素,然后Pass=Replace,会将通过的像素写入模板值(Ref & WriteMask=3),即两圆相交部分模板值为3
这个是RawImage的Material,只有模板值等于3的像素可以通过模板测试,所以只有两个圆相交的部分可以写入buffer,其他部分舍弃,通过或者失败都不改变模板值
这是Mask2的unmaskMaterial,将两个圆相交部分的模板值设置为1,也就是还原Mask2之前的stencil buffer
这是Mask1的unmaskMaterial,将第一个圆内的模板值设置为0,还有成最初的stencil buffer
可以看到Mask会产生比较严重的overdraw。
2.drawcall和合批
每添加一个mask,一般会增加2个drawcall(加上mask会阻断mask外和mask内的合批造成的额外drawcall),一个用于设置遮罩用的stencil buffer,一个用于还原stencil buffer。
如图,同一个Mask下放置两个使用相同的RawImage,通过Profiler可以看到两个RawImage可以进行合批
如图,两个RawImage使用相同的,它们处于不同的Mask之下,但是只要m_StencilValue相等,两个RawImage还是网店asp源码可以进行合批。同时可以看到Mask1和Mask1 (1),Mask2和Mask2 (1)也进行了合批,说明stencilDepth相等的Mask符合合批规则也可以进行合批。
StencilMaterial.Add会将修改后的材质球缓存在m_List中,因此调用StencilMaterial.Add在相同参数情况下将获得同一个材质球。
图像裁剪的终极指南:使用Python和Tkinter实现自定义裁剪
终极指南:利用Python和Tkinter打造自定义图像裁剪工具 在处理学术会议PPT时,遇到的问题是需要批量裁剪图像,同时避免状态栏和键盘干扰。通过Python和Tkinter,我们可以创建一个用户友好的工具,实现图像选择、裁剪及保存。关键挑战在于处理图像显示和坐标系转换,以下是实现步骤: 首先,需要调整Tkinter中tk.Canvas的大小,确保完整显示。这需要反复尝试以找到合适的尺寸,以适应不同大小的。改变分辨率后,可能需要处理不同坐标系的问题,以便确保裁剪区域的一致性。 源代码2-1用于单个图像的坐标测试,测试成功后,将尺寸信息应用到批量处理的代码中。以下是代码解析:导入PIL、ImageTk和os等必要模块,用于图像处理和操作系统交互。
创建ImageCropper类,初始化方法中处理图像路径和裁剪区域。
在Tkinter窗口中创建画布,并绑定鼠标事件以响应裁剪操作。
调整图像大小并将其转换为Tkinter可用的图像。
通过事件循环保持窗口打开,等待用户操作。
记录鼠标按下、拖动和释放事件,更新裁剪区域。答案网站源码
定义方法,将裁剪区域从源分辨率转换为目标分辨率。
批量处理函数,创建输出目录,遍历文件,裁剪并保存图像。
最后,实例化ImageCropper类,通过鼠标交互进行裁剪,并执行批量处理,将图像按照自定义区域裁剪并保存。在线CAD(H5 WEB CAD)中根据图框拆分DWG图纸和转成pdf打印
在线CAD(H5 WEB CAD)中,当用户需要根据图框拆分DWG图纸并转换为PDF进行打印时,传统桌面端CAD软件无法满足需求。为解决这一问题,本文介绍了一种通过使用云图开发包中的Node服务实现此功能的方法。首先,下载云图开发包,启动梦想云图Node.JS服务。在Web端展示DWG图纸之前,需要确保系统中已安装了适当的转换程序,若不熟悉原理,可参考快速入门中的《如何在自己系统中浏览dwg文件》章节。对于更直观的预览效果,推荐阅读《mxdraw前端库预览图纸》章节。
使用mxdraw库预览图框,并通过绘制选框选择需要裁剪的部分。前端代码将与梦想云图NodeJS服务的API接口协作,执行裁剪操作,生成PDF或DWG文件。操作流程如下:
将测试图纸放置于D盘,并确保该文件位于demo示例(zip下载地址)中的public目录下。使用云图开发包中的MxWebDwg2Jpg.exe程序对图纸进行剪切,输出为PDF或DWG格式。为此,需要在D盘创建名为cutcad_param.txt的文件,并在此文件中存储剪切所需的参数。命令行中执行MxWebDwg2Jpg.exe命令,其中cutcad文件参数和cutcad_param.txt文件的位置是关键。成功执行后,命令行将返回结果,确保剪切操作顺利完成。
NodeJS后端实现中,云图开发包的Node服务提供了相应的接口,可通过MxDrawCloudServer\Bin\MxDrawServer\Windows\routes目录中的源码查看。通过user.js文件中定义的tools接口,前端代码与后端进行交互测试,调用convert.js文件中的callCADTools函数进行剪切操作。
剪切后的结果将呈现为PDF或DWG文件,实际显示效果如下:
具体操作时,应注意以下事项:
部分图纸在裁剪过程中可能无效,有问题的图纸应及时反馈给技术支持。前端mxdraw库实现裁剪功能时,需将坐标转换为CAD文档坐标,以确保后端能够准确执行裁剪。云图开发包Node服务中的API接口主要用于测试功能的实现,具体应用时应根据实际需求进行调整。通过out参数,可以将剪切内容保存为PDF或DWG格式的文件。FFMPEG编译裁剪移植
1.ffmpeg文件结构说明
1.1 ffmpeg模块说明
libavformat
用于各种音视频封装格式的生成和解析,包括获取解码所需信息以生成解码上下文结构和读取音视频帧等功能;音视频的格式解析协议,为 libavcodec 分析码流提供独立的音频或视频码流源。
libavcodec
用于各种类型声音/图像编解码。该库是音视频编解码核心,实现了市面上可见的绝大部分解码器的功能。
libavdevice
硬件采集、加速、显示。操作计算机中常用的音视频捕获或输出设备。
libavfilter
音视频滤波器的开发,如宽高比、裁剪、格式化、非格式化伸缩。
libavutil
包含一些公共的工具函数的使用库,包括算数运算、字符操作。
libavresample
音视频封转编解码格式预设等。
libswscale
原始视频格式转换,用于视频场景比例缩放、色彩映射转换;图像颜色空间或格式转换,如 rgb、rgb 等与 yuv 等之间转换。
libswresample
原始音频格式转码。
libpostproc
同步、时间计算的简单算法,用于后期效果处理;音视频应用的后处理,如图像的去块效应
在编译ffmpeg源码之前,我们可以通过配置编译参数选择是否编译生成如上库。一般而言,要实现最基本的音视频编解码功能,libavformat,libavcodec,libavutil这三个库是不可缺少的。我们通过使能或失能ffmpeg支持的组件,如编解码器、分流器、合流器、解析器、协议类型等,来裁剪库文件的大小。
1.2名词解释
encoder // 编码器
decoder // 解码器
hwaccel // 硬件加速器
muxer // 合流器
demuxer // 分流器
parser // 解析器
bsf // 比特过滤器
protocol // 协议
indev // 输入设备
outdev // 输出设备
filter // 过滤器
相关学习资料推荐,点击下方链接免费报名,先码住不迷路~
音视频免费学习地址:FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发
免费分享音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击 加群免费领取~
2.编译
ffmpeg 编译帮助
主要包含一下选项
Help options // 帮助选项,可以查看全部支持的编解码,硬件加速器,解析器、输入输出设备等参数的列表,一般做裁剪时需要查询;
Standard options // 标准选项,主要是目录路径相关的设置,常用的为--prefix=PREFIX 设置安装路径;
Licensing options // license 相关选项 GPL使能设置相关;
Configuration options // 配置选项,常用的--disable-static关闭静态库 默认是开启静态库编译的--enable-shared 使能动态库编译,编译出动态库--enable-small优化大小而不是注重运行速度;
Program options // 编译出工具文件,一般的bin文件,常用的ffmpeg ffprobe 和ffplay三个工具的bin文件编译;
Documentation options // 文档选项,是否构建文档页面,个人猜测是工具的帮助文件是否编译进去,里面支持html manpage txt等格式文件;
Component options // 组件选项,常用使能或者关闭某些模块的编译,libavformat,libavcodec,libavutil这三个库一般是不可或缺的,还有其他的组件按自己需要使能;
Individual component options // 独立的组件选项,更为具体的组件编译选项,如果需要剪裁一般情况先使用--disable-everything 关闭全部的组件,然后再单独开启需要的组件;
External library support // 扩展库支持,允许FFmpeg链接到相应的外部库;
Toolchain options // 工具链选项,交叉编译常用,比较常用的--arch=ARCH 指定系统架构 --cpu=CPU指定cpu类型 --cross-prefix交叉编译工具链前缀 --enable-cross-compile 使能交叉编译--target-os=OS指定操作系统;
Advanced options (experts only) // 高级选项,一般较少使用,不懂的请慎用,以免引进bug;
Optimization options (experts only): --disable-asm关闭所有的优化选项
Developer options (useful when working on FFmpeg itself): --disable-debug 关闭调试符号信息,减小库大小;
2.1全编配置
采用默认配置 交叉编译,在当前目录下output文件夹生成对应的文件
编译后的文件夹下有bin include lib share 目录bin存放交叉编译后的ffmpeg等工具bin文件,include目录存放头文件,移植需要 lib存放动态和静态库,将lib里面的文件拷贝到板端或者静态库使用即可;
编译后未经裁剪的ffmpeg库实在太大,十几M的大小,需要裁剪;
2.2裁剪库
ffmpeg 库过大,很多功能其实没必要使用的, 裁剪为仅支持mp4 和 avi两种格式的视频,avi:视频采用h编码,音频采用pcm_alaw mp4:视频h,音频aac格式;这个指令其实还可以进一步裁剪,不想麻烦,够用就行,不再裁剪@_@;
裁剪后的文件大小最大也只剩1.1M,大小减少倍;
3.ffmpeg移植问题
3.1时间冲突问题
libavutils/time.h文件名字和linux系统的time.h的名字冲突,在编译的时候会出现time.h文件是有两个,无法区分是哪个time.h,因此会出现报错,如果在ffmepg里将time.h文件重命名可以解决这个问题,但这样太麻烦而且容易出错,采用另外一种方式,将makefile的搜索路径更改为只搜索到include文件夹,然后在include文件夹下放置相关的头文件,而在调用的c文件上路径改为
这样就躲开了搜索文件名字一样的问题,其本质是将ffmpeg的time.h重新命名为libavutils/time.h
3.2函数符号导出问题
由于移植需要单独导出库内部的局部函数,如mov_write_packet mov_write_header mov_write_trailer等函数,将movenc.c对应函数的static去掉,同时在libavformat.h文件声明函数,但是生成的库会发现没有找到对应的函数符号
avi相关的函数也做同样的处理,但是avi有这个函数符号,这个问题只能反推编译过程查找哪里将函数符号屏蔽掉了采用指令
发现在生成库的时候会调用一个脚本文件,这个脚本文件最后在config.mak里面指定了
--version-script这个选项仅仅导出要使用的符号表,这个文件对应libavformat里面的就是libavformat.vlibavformat.verlibavformat.version,后两个文件都是根据第一个文件产生的,查看libavformat.v文件
显然,在这里屏蔽掉了非av开头的全部函数,所有mov开头的函数无法被外部调用,因此更改这个文件,将mov开头的函数也导出
重新编译发现可以调用mov开头的函数了。
不足之处,敬请指出,谢谢^_^
4.参考资料
CSDN 博客 SigmaStarDocs 《ffmpeg基础库编程开发》
原文 FFMPEG编译裁剪移植_ffmpeg编译到移远模块_Kingkim的博客-CSDN博客
CropperJs裁剪案例及教程
在前端开发过程中,上传的问题时常出现,尤其是面对多种规格的,设置裁剪功能可以更有效地解决问题。本文将介绍cropper.js裁剪插件的用例,基于V1版本的v1.5.进行案例制作。
本文案例主要针对移动端选择和相机拍照后的裁剪功能。具体代码和效果图请查看文章末尾。
首先,我们需要了解如何使用cropperJs(V1)。以下是安装方法:
安装方法有两种:npm安装和浏览器直接引入。
使用方法:在引入所有依赖后,可以使用Cropper对象,传入image和options两个参数。第一个参数是要包装的图像或画布元素,第二个参数是cropper内置的属性设置及方法。
以下是完整的移动端裁剪案例源码:
htmlCSSJS文中需要用的一些js方法。
以上是完整案例的代码,效果图请查看文章末尾。
cropper常用参数及方法解析options。
案例中设置了一些cropper常用的属性,它还有很多其他属性,包括string、Number、String、Function类型。以下是内置的属性和属性值:
options类型为Function的属性:
常用的一些Methodsreplace(url[, onlyColorChanged])crop()reset()clear()destroy()move(offsetX[, offsetY])moveTo(x[, y])zoom(ratio)rotate(degree)getData([rounded])getImageData()。
以上是我们应该能用到的大部分方法及内置属性。cropper真的很强大,几乎包含了我们实际开发中所需要的内容。以下是开头提到的案例截图,需要的可以自取源码。
主页面,上传按钮及裁剪完成后回显内容。
裁剪过程弹窗。
裁剪完成回显内容。