openexr-2.3.0-windows编译
本文操作按照《c&c++开源库编译指南》中内容规范编写,编译环境配置、工具下载、目录规划,及更多其他开源库编译方法请参考该文章。
c&c++开源库编译指南:https://blog.csdn.net/binary0006/article/details/144086155
本文章中的源代码已提交到gitee仓库,地址:https://gitee.com/binary0010/depends/tree/master/c/openexr-2.3.0
1.openexr概述
OpenEXR 是由工业光魔(Industrial Light & Magic,ILM)开发的一种用于存储高动态范围(HDR)图像数据的文件格式,同时也是一套实现该格式读写操作的开源库,在影视、动画、游戏等视觉特效领域有着广泛应用。
从技术角度来看,OpenEXR 采用了无损压缩算法,如 PIZ、PXR24 等,能够在有效减小文件体积的同时,最大程度保留图像的原始信息,确保图像的高质量和高保真度。它支持多通道数据存储,除了常见的红、绿、蓝(RGB)通道外,还可以存储深度、法线、透明度等额外信息,为后期制作提供了丰富的数据支持。OpenEXR 库使用 C++ 编写,提供了一套完整的 API,方便开发者进行图像的读写操作。在编译方面,它具有良好的跨平台性,可在 Linux、Windows、macOS 等多种操作系统上编译,不过编译时可能依赖一些其他的库,如 zlib、Imath 等。
在应用场景上,OpenEXR 主要用于影视制作中的合成、渲染和后期处理环节。在渲染过程中,渲染器可以将生成的高动态范围图像保存为 OpenEXR 格式,方便后续的颜色校正、合成等操作。在后期合成阶段,OpenEXR 的多通道数据可以帮助合成师更精确地控制图像的各个部分,实现复杂的特效。此外,在游戏开发中,OpenEXR 也逐渐被用于存储和处理高质量的纹理和光照信息。
在开源社区,OpenEXR 遵循 BSD 许可协议,代码托管在 GitHub 上。社区非常活跃,不断有开发者对其进行维护和更新,添加新的功能、优化性能以及修复潜在的漏洞。许多知名的影视制作公司、动画工作室和游戏开发团队都在使用 OpenEXR,它已经成为了高动态范围图像存储和处理的行业标准之一。
2.openexr编译
2.1.源代码下载
openexr源代码可以在github上下载,源代码下载地址:https://github.com/AcademySoftwareFoundation/openexr/releases,这里我们使用2.3.0版本,使用较低的版本能确保vs2008编译不会出错,在这个界面往后翻直到找到2.3.0版本后,按照下面的截图选择下载openexr-2.3.0.tar.gz。
2.2.windows编译
先解压源代码到指定目录,openexr-2.3.0版本已经了提供CMakeLists.txt编译脚步,我们按照规范会对该脚本进行修改。
2.2.1.openexr源代码工程分析
当我们打开 openexr 源代码根目录下的 CMakeLists.txt 文件时,能够清晰地看到其中包含了多个关键子目录,分别为 IlmBase、OpenEXR、PyIlmBase 和 OpenEXR_Viewers,并且每个子目录下又涵盖了多个工程,下面将详细阐述这些子目录及其包含工程的作用。
2.2.1.1.IlmBase 子目录
IlmBase 是 OpenEXR 的基础库,它为 OpenEXR 提供了核心的数据结构和算法支持,是整个 OpenEXR 项目的基石。该子目录下的工程主要实现了一些基础的功能,这些功能对于处理高动态范围图像数据至关重要。
Half 工程:Half 工程主要负责实现半精度浮点数(16 位浮点数)的处理。在处理高动态范围图像时,半精度浮点数可以在减少存储空间的同时,保留足够的精度来表示图像数据。Half 工程提供了半精度浮点数与单精度浮点数(32 位浮点数)之间的转换函数,以及一些基本的数学运算函数,方便开发者在不同精度之间进行切换。
Iex 工程:Iex 工程是一个异常处理库,它为 OpenEXR 提供了统一的异常处理机制。在处理图像数据时,可能会遇到各种错误情况,如文件读取错误、数据格式错误等。Iex 工程定义了一系列的异常类,开发者可以使用这些异常类来捕获和处理不同类型的错误,提高代码的健壮性和可维护性。
Imath 工程:Imath 工程实现了一组数学库,包括向量、矩阵、四元数等基本数学对象的定义和操作。在图像处理中,这些数学对象被广泛用于表示图像的几何信息,如位置、方向、旋转等。Imath 工程提供了丰富的数学运算函数,方便开发者进行图像的变换和处理。
2.2.1.2.OpenEXR 子目录
OpenEXR 子目录是整个项目的核心部分,它实现了 OpenEXR 文件格式的读写功能,以及相关的压缩和解压缩算法。该子目录下的工程主要围绕 OpenEXR 文件的处理展开。
OpenEXR 核心库工程:该工程实现了 OpenEXR 文件的读写功能,包括文件头的解析、数据块的读写、通道信息的处理等。它提供了一组 API 接口,开发者可以使用这些接口来创建、读取和修改 OpenEXR 文件。
压缩算法工程:OpenEXR 支持多种压缩算法,如 PIZ、PXR24、ZIP 等。压缩算法工程实现了这些压缩算法的具体实现,通过对图像数据进行压缩,可以有效减少文件的存储空间,提高数据传输效率。
测试工程:为了确保 OpenEXR 库的正确性和稳定性,测试工程包含了一系列的单元测试和集成测试。这些测试用例覆盖了 OpenEXR 库的各个功能模块,通过运行这些测试用例,可以及时发现和修复潜在的问题。
2.2.1.3.PyIlmBase 子目录
PyIlmBase 子目录提供了 Python 绑定,使得开发者可以在 Python 环境中使用 OpenEXR 的功能。该子目录下的工程主要实现了 Python 与 C++ 代码之间的交互。
Python 绑定工程:该工程使用 SWIG(Simplified Wrapper and Interface Generator)工具生成 Python 与 C++ 代码之间的绑定。通过这些绑定,开发者可以在 Python 脚本中直接调用 OpenEXR 的 C++ 库函数,方便地进行图像处理和分析。
示例脚本工程:为了帮助开发者快速上手,示例脚本工程提供了一些使用 PyIlmBase 的示例脚本。这些脚本展示了如何在 Python 环境中创建、读取和修改 OpenEXR 文件,以及如何进行简单的图像处理操作。
2.2.1.4.OpenEXR_Viewers 子目录
OpenEXR_Viewers 子目录包含了一些用于查看和显示 OpenEXR 文件的工具。这些工具可以帮助开发者直观地查看 OpenEXR 文件的内容,进行图像的预览和调试。
在实际的 C++ 开发中,通常仅需要将 IlmBase 和 OpenEXR 作为 SDK(软件开发工具包)来使用。IlmBase 提供的基础数据结构和算法,是构建 OpenEXR 相关功能的根基。开发人员在处理图像数据时,会频繁使用到 IlmBase 中定义的半精度浮点数处理、异常处理以及数学运算等功能。而 OpenEXR 则提供了直接操作 OpenEXR 文件的核心功能,开发人员可以利用其提供的 API 接口,轻松实现对 OpenEXR 文件的读写操作,以及进行数据的压缩和解压缩处理。
将 IlmBase 和 OpenEXR 作为 SDK 集成到项目中,能够让开发人员专注于业务逻辑的实现,而无需过多关注底层的细节。通过调用这些 SDK 提供的接口,开发人员可以高效地开发出与 OpenEXR 文件处理相关的应用程序,如影视后期制作软件、图像编辑工具等。而 PyIlmBase 和 OpenEXR_Viewers 子目录中的内容,对于大多数 C++ 开发场景来说并非必需,它们更多地是为 Python 开发者或者需要进行文件查看和调试的人员提供便利。
通过对这些子目录及其包含工程的分析,我们可以全面了解 openexr 源代码的结构和功能,为后续的编译和开发工作打下坚实的基础。
2.2.2.工程预览
OpenEXR的子工程很多,这里先预览一下修改完CMakeLists.txt之后生产的vs工程,一屏幕的高度快放不下了。
2.2.3.修改CMake脚本
上面已经看到OpenEXR的子工程很多,修改关联的CMakeLists.txt脚本也会很多,这里给出其中一个修改的示例。
IlmBase\Half\CMakeLists.txt
# yue.nicholas@gmail.comADD_EXECUTABLE(eLut eLut.cpp)
ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/eLut.hCOMMAND $<TARGET_FILE:eLut> ARGS > ${CMAKE_CURRENT_BINARY_DIR}/eLut.hDEPENDS eLut)
SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_BINARY_DIR}/eLut.hPROPERTIES HEADER_FILE_ONLY TRUE)ADD_EXECUTABLE(toFloat toFloat.cpp)
ADD_CUSTOM_COMMAND(OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/toFloat.hCOMMAND $<TARGET_FILE:toFloat> ARGS > ${CMAKE_CURRENT_BINARY_DIR}/toFloat.hDEPENDS toFloat)SET_SOURCE_FILES_PROPERTIES(${CMAKE_CURRENT_BINARY_DIR}/toFloat.hPROPERTIES HEADER_FILE_ONLY TRUE)SET_SOURCE_FILES_PROPERTIES(half.cppPROPERTIESOBJECT_DEPENDS"${CMAKE_CURRENT_BINARY_DIR}/eLut.h;${CMAKE_CURRENT_BINARY_DIR}/toFloat.h"
)SET(ILMBASE_LIB_TARGETS "")# IF(OPENEXR_BUILD_SHARED)
# LIST(APPEND ILMBASE_LIB_TARGETS Half)# ADD_LIBRARY(Half SHARED
# half.cpp
# )# TARGET_COMPILE_DEFINITIONS(Half PRIVATE HALF_EXPORTS)
# IF(WIN32)
# TARGET_COMPILE_DEFINITIONS(Half PUBLIC OPENEXR_DLL)
# ENDIF()# SET_TARGET_PROPERTIES(Half
# PROPERTIES
# VERSION ${OPENEXR_VERSION}
# SOVERSION ${OPENEXR_SOVERSION}
# OUTPUT_NAME "Half${ILMBASE_LIBSUFFIX}"
# )# ADD_DEPENDENCIES(Half toFloat eLut)
# ENDIF()# IF(BUILD_ILMBASE_STATIC)
# LIST(APPEND ILMBASE_LIB_TARGETS Half_static)# ADD_LIBRARY(Half_static STATIC
# half.cpp
# )# SET_TARGET_PROPERTIES(Half_static
# PROPERTIES
# VERSION ${ILMBASE_VERSION_MAJOR}.${ILMBASE_VERSION_MINOR}.${ILMBASE_VERSION_PATCH}
# OUTPUT_NAME "Half${ILMBASE_LIBSUFFIX}_s"
# )# ADD_DEPENDENCIES(Half_static toFloat eLut)
# ENDIF()# IF(OPENEXR_BUILD_SHARED OR BUILD_ILMBASE_STATIC)
# INSTALL(TARGETS
# ${ILMBASE_LIB_TARGETS}
# ARCHIVE DESTINATION lib
# LIBRARY DESTINATION lib
# RUNTIME DESTINATION ${RUNTIME_DIR}
# )
# ENDIF()# INSTALL(
# FILES
# half.h
# halfFunction.h
# halfExport.h
# halfLimits.h# DESTINATION
# include/OpenEXR
# )# if(OPENEXR_BUILD_SHARED)
# add_library(IlmBase::Half ALIAS Half)
# endif()
# if(BUILD_ILMBASE_STATIC)
# add_library(IlmBase::Half_static ALIAS Half_static)
# endif()# 静态库工程
add_library(Halflib STATIChalf.cpp
)
add_dependencies(Halflib toFloat eLut)
add_library(IlmBase::Halflib ALIAS Halflib)# 动态库工程
add_library(Halfdll SHAREDhalf.cpp
)
target_compile_definitions(Halfdll PRIVATE HALF_EXPORTS)
if(WIN32)target_compile_definitions(Halfdll PUBLIC OPENEXR_DLL)
endif()
add_dependencies(Halfdll toFloat eLut)
add_library(IlmBase::Halfdll ALIAS Halfdll)if(MSVC)# 静态库mt工程add_library(Halflibmt STATIChalf.cpp)set_property(TARGET Halflibmt PROPERTYMSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")add_dependencies(Halflibmt toFloat eLut)add_library(IlmBase::Halflibmt ALIAS Halflibmt)# 动态库mt工程add_library(Halfdllmt SHAREDhalf.cpp)set_property(TARGET Halfdllmt PROPERTYMSVC_RUNTIME_LIBRARY "MultiThreaded$<$<CONFIG:Debug>:Debug>")target_compile_definitions(Halfdllmt PRIVATE HALF_EXPORTS PUBLIC OPENEXR_DLL)add_dependencies(Halfdllmt toFloat eLut)add_library(IlmBase::Halfdllmt ALIAS Halfdllmt)# 设置静态库pdb文件set_lib_pdb_file(Half lib)set_lib_pdb_file(Half libmt)endif(MSVC)#安装sdk相关文件
#安装头文件
if(NOT SKIP_INSTALL_HEADERS AND NOT SKIP_INSTALL_ALL)install(FILEShalf.hhalfFunction.hhalfExport.hhalfLimits.hDESTINATION ${INSTALL_INC_DIR})
endif()if(NOT SKIP_INSTALL_LIBRARIES AND NOT SKIP_INSTALL_ALL)#安装库文件set(Half_targets Halflib Halfdll)if(MSVC)list(APPEND Half_targets Halflibmt Halfdllmt)endif()install(TARGETS ${Half_targets}RUNTIME DESTINATION "${INSTALL_BIN_DIR}"ARCHIVE DESTINATION "${INSTALL_LIB_DIR}"LIBRARY DESTINATION "${INSTALL_LIB_DIR}")
endif()#安装pdb文件
if(NOT SKIP_INSTALL_PDB AND NOT SKIP_INSTALL_ALL)install(FILES $<TARGET_PDB_FILE:Halfdll> $<TARGET_PDB_FILE:Halfdllmt>DESTINATION "${INSTALL_BIN_DIR}"OPTIONAL)# 静态库pdb调用函数安装install_lib_pdb_file(Half lib)install_lib_pdb_file(Half libmt)
endif()
2.2.4.vs2008编译
前面我们已经把vs2008编译需要处理的源代码以及CMakeLists.txt脚本按照规范修改完毕,下面我们将使用cmake来构建vs2008的工程和编译。
2.2.4.1.使用cmake构建工程并编译
以前的文章中,已经有很多详细的cmake步骤了,操作流程都是一样的,其实也很简单。这里就不再累述了,注意设置build目录为源代码根目录下的cmake-vs2008绝对路径为D:/x-app/depends/c/libiconv-1.11.1/cmake-vs2008,已经编译器的选择即可。
这里勾选项注意一下,取消不需要的项,否则可能会构建报错。
2.2.4.2.编译工程
使用vs2008打开“OpenEXR.sln”解决方案文件,分别编译Debug和RelWithDebInfo配置。
根据下面截图可以看出来,编译后的库文件还是比较多的。
2.2.4.3.安装库文件、头文件
编译Install工程的Debug和RelWithDebInfo配置,.h文件和编译生成.dll、.lib、pdb文件会拷贝CMakeList.txt中设置的路径下。
2.2.5.vs2015编译
vs2015编译与vs2008相同的,只需要在CMake生成工程时选择vs2015即可,其他版本的vs也是一样的,选择需要使用的vs版本即可,此处只演示一下vs2015的编译。
因为前面生成过vs2008的工程,需要将build目录设置成cmake-vs2015,再“Configure”选择vs2015即可,其他操作就是一样的了。
相关文章:
openexr-2.3.0-windows编译
本文操作按照《c&c开源库编译指南》中内容规范编写,编译环境配置、工具下载、目录规划,及更多其他开源库编译方法请参考该文章。 c&c开源库编译指南:https://blog.csdn.net/binary0006/article/details/144086155 本文章中的源代码已…...
【NLP 面经 8】
目录 一、文本生成任务 模型架构方面 训练数据方面 生成策略方面 二、命名实体识别任务NER 模型架构方面 特征工程方面 训练优化方面 三、情感分析任务 模型架构方面 训练数据方面 超参数调整方面 四、计算余弦相似度并添加符合条件结果 提示: 思路与算法 任由深渊的…...
Qt项目——记事本
目录 前言工程文档一、功能介绍二、界面预览三、UI设计师工具四、给三个按钮设置贴图五、信号与槽六、实现文件打开功能代码实现代码实现 七、实现文件保存代码内容 八、实现文件关闭代码实现 九、显示高亮和行列位置代码实现 十、实现快捷功能代码实现 总结 前言 这个项目就是…...
WHAT - React 惰性初始化
目录 在 React 中如何使用惰性初始化示例:常规初始化 vs. 惰性初始化1. 常规初始化2. 惰性初始化 为什么使用惰性初始化示例:从 localStorage 获取值并使用惰性初始化总结 在 React 中,惰性初始化(Lazy Initialization)…...
HOW - 如何测试 React 代码
目录 一、使用 React 测试库:testing-library/react二、使用测试演练场:testing-playground.com三、使用 Cypress 或 Playwright 进行端到端测试四、使用 MSW 在测试中模拟网络请求 一、使用 React 测试库:testing-library/react testing-li…...
React 条件渲染
开发环境:Reacttsantd 通常你的组件会需要根据不同的情况显示不同的内容。在 React 中,你可以通过使用 JavaScript 的 if 语句、&& 和 ? : 运算符来选择性地渲染 JSX。 例子 我们在满足 isPacked{true} 条件的物品清单旁加上一个勾选符号✔。…...
使用 Canal 实现 MySQL 与 ES 数据同步的技术实践
前言 本文将详细讲解如何使用阿里的 Canal 工具,实现 MySQL 向 ES(Elasticsearch)的数据同步。 数据同步有多种方式,双写同步数据方式因性能慢、存在分布式事务及数据一致性问题、业务耦合度高且难以扩展,不适合采用…...
《实战AI智能体》什么是 Scrum 项目管理及为什么需要它
Scrum 项目管理是一种敏捷项目管理方法,强调团队合作、迭代开发和客户参与。它的核心概念包括 Scrum 团队、产品待办事项列表、Sprint、每日站立会议、Sprint 回顾会议等。Scrum 团队由产品负责人、Scrum 主管和开发团队组成,他们共同负责项目的规划、执行和交付: 产品待办事…...
智能硬件开发革命:低代码平台+物联网
物联网和低代码开发 初识物联网 物联网的概念 20 世纪末,随着计算机网络和通信技术的兴起,互联网开始走进并融入人们的生活。传统互联网通常以人作为主体,数据的产生和传输都在人的控制下进行,数据的应用结果也在具体的人身上得…...
「合诚」携手企企通共建新材料和健康产业采购数智化新生态
在科技革命与产业变革深度融合的时代背景下,新材料与健康产业正迎来数字化、智能化的快速发展。 技术突破与消费升级的双重驱动,推动着行业不断创新,同时也对企业的供应链管理提出了更高要求。 1、合诚:聚焦新材料与健康产业&am…...
ansible角色
一、角色 role 本质上就是目录 /etc/ansible/roles 1、创建角色 tree查看目录结构 在同一个角色中,相互引用文件、操作时,不需要添加任何路径 删除角色,将角色目录中的角色文件删除 案例:部署zabbix agent 执行角色...
WHAT - React 元素接收的 ref 详解
目录 1. ref 的基本概念2. 如何使用 ref2.1 基本用法2.2 类组件使用 createRef 3. forwardRef 转发 ref4. ref 的应用场景5. ref 和函数组件总结 在 React 中,ref(引用)用于访问 DOM 元素或类组件实例。它允许我们直接与元素进行交互…...
数字游戏(继Day 10)
主体: #include<stdio.h> #include<time.h> #include<stdlib.h>#include"mygetch.h"#define MAX 51 //定义测试字母的最大长度void help() {printf("\n****************************************");printf("\n*输入过程中无法退出…...
react 中将生成二维码保存到相册
需求:生成二维码,能保存到相册 框架用的 react 所以直接 qrcode.react 插件,然后直接用插件生成二维码,这里一定要写 renderAs{‘svg’} 属性,否则会报错,这里为什么会报错??&#…...
React-05React中props属性(传递数据),propTypes校验,类式与函数式组件props的使用
1.类式组件props基本数据读取与解构运算符传递 <script type"text/babel">// 创建组件class PersonalInfo extends React.Component {render() {// 读取props属性 并读取值console.log(props,this.props);return(<ul><li>姓名:{this.p…...
export default function?在react中在前面还是后面呢?
好的!我将通过几个具体场景的代码示例,展示不同 export default 使用方式的适用情况,并给出推荐实践。 场景 1:基础组件(推荐直接导出) 适用情况:简单组件,无需额外处理 // 方式A:…...
红米手机输入正确密码也无法解锁的问题的可尝试解决方法
文章目录 问题现象官方途径没看到有能给解决的可尝试解决方法(汇总小红书成功解决方法,但从回复来看,多为成功的个例,整体而言希望不大)重启/强制重启尝试之前的密码等待一晚上后再次尝试输入密码,包括重启…...
优选算法系列(6.模拟)
一.替换所有的问号(easy) 题目链接:1576. 替换所有的问号 - 力扣(LeetCode) 解法: 纯模拟。从前往后遍历整个字符串,找到问号之后,就用 a ~ z 的每⼀个字符去尝试替换即可。 代码…...
罗技K860键盘
罗技蓝牙键盘的顶部功能键F1-F12的原本功能 单击罗技键盘的功能键时,默认响应的是键盘上面显示的快进、调节音量等功能。改变回F1~F12原本功能,同时按下 fn和esc组合键...
⭐算法OJ⭐数据流的中位数【最小堆】Find Median from Data Stream
最小堆 最小堆是一种特殊的完全二叉树数据结构。 基本定义 堆性质:每个节点的值都小于或等于其子节点的值(根节点是最小值)完全二叉树性质:除了最底层外,其他层的节点都是满的,且最底层的节点都靠左排列…...
node-modules-inspector 使用以及 node_modules可视化 依赖关联关系快速分析
node-modules-inspector 使用以及 node_modules可视化 依赖关联关系快速分析 node-modules-inspector 简介 node-modules-inspector 是一个用于分析和可视化 node_modules 依赖关系的工具,主要功能包括: 依赖可视化:以交互式图表展示项目的依…...
python自动登录远程设备的几种方式(华为设备)
其实登录远程设备(交换机路由器)的方式无非就是通过SSH或者是Telnet这两个协议,当然最主要的还是SSH,这里主要讲的是通过这两个协议登录远程设备的几个方式 拓扑 本文都是用的这个拓扑,主要通过编写python脚本来登录其…...
【android bluetooth 框架分析 01】【关键线程 1】【关键线程介绍】
1. 为什么学习蓝牙协议栈之前,必须先梳理清楚这几大线程? 为什么 学习协议栈之前 最好是要先梳理清楚 关键线程 bt_stack_manager_threadbt_jni_threadbt_main_threadbt_a2dp_sink_worker_thread 1.1 蓝牙协议栈是典型的“多线程异步系统” 蓝牙协议…...
LDAP高效数据同步:Syncrepl复制模式实战指南
#作者:朱雷 文章目录 一、Syncrepl 复制简介1.1. 什么是复制模式1.2. 什么是 syncrepl同步复制 二、Ldap环境部署三、配置复制类型3.1. 提供者端配置3.2. 消费者端配置3.3.启动服务3.4.测试同步是否生效 四、总结 一、Syncrepl 复制简介 1.1. 什么是复制模式 Ope…...
SeeGround: See and Ground for Zero-Shot Open-Vocabulary 3D Visual Grounding
CVPR 2025 核心问题与动机 问题背景:3D视觉定位(3DVG)要求根据文本描述在3D场景中定位目标物体,是增强现实、机器人导航等应用的关键技术。传统方法依赖标注的3D数据集和预定义类别,限制了其在开放场景中的扩展性。现…...
深入理解Spring IoCDI
1. 引言:为什么需要IoC和DI? 传统开发方式的耦合性问题 在传统开发中,对象通常通过 new 关键字直接创建,例如: // 直接依赖具体实现类 UserService userService new UserServiceImpl(); OrderService orderService…...
NO.78十六届蓝桥杯备战|数据结构-并查集|双亲表示法|初始化|查询|合并|判断|亲戚|Lake Counting|程序自动分析(C++)
双亲表⽰法 接下来要学习到的并查集,本质上就是⽤双亲表⽰法实现的森林。因此,我们先认识⼀下双亲表⽰法。 在学习树这个数据结构的时,讲到树的存储⽅式有很多种:孩⼦表⽰法,双亲表⽰法、孩⼦双亲表⽰法以及孩⼦兄弟表…...
20250407-组件v-model
基本用法 v-model 可以在组件上使用以实现双向绑定。 首先看下 v-model 在原生元素上的用法: <input v-model"searchText" /> 在代码背后,模板编译器会对 v-model 进行更冗长的等价展开。因此上面的代码其实等价于下面这段ÿ…...
oracle 存储体系结构
oracle 存储体系结构 参考: Logical Storage Structures (oracle.com)...
晋城市电子健康证上传照片尺寸要求及手机拍照制作方法
晋城市餐饮从业人员健康证电子照片上传有着明确的技术规范。根据"晋城市从业人员电子健康证明服务平台"要求,照片尺寸应为358像素(宽)441像素(高),这一比例符合标准证件照的规格。照片底色可选择…...
STL c++ list——模拟实现
结点类的模拟实现 list是一个带头双向循环链表 因需要实现一个节点类,其中包含哨兵位(用来标识位置),节点信息(val数据,prev后指针,next后指针) template<class T> struct …...
【ES系列】Elasticsearch从入门到精通保姆级教程 | 启篇
🔥 本系列将带你从零开始学习Elasticsearch,通过保姆级教程,手把手教你掌握这个强大的搜索与分析引擎。无论你是完全的新手,还是想系统学习ES的开发者,这个系列都能满足你的需求。 📚博主匠心之作,强推专栏: JAVA集合专栏 【夜话集】JVM知识专栏数据库sql理论与实战【…...
图解Java运行机制-JVM、JRE、JDK区别
以下是Java运行机制及JVM、JRE、JDK区别的图解与说明: --- ### 一、Java程序运行机制 1. **编写与编译** Java源文件(.java)通过**JDK中的编译器(javac)**编译为字节码文件(.class)ÿ…...
UML类图综合实验三补档
1.使用简单工厂模式模拟女娲(Nvwa)造人(Person),如果传入参数“M”,则返回一个Man对象,如果传入参数“W”,则返回一个Woman对象,用Java语言实现该场景。现需要增加一个新的Robot类,如果传入参数“R”&#…...
OpenHarmony子系统开发 - DFX(八)
OpenHarmony子系统开发 - DFX(八) 八、Faultlogger开发指导 概述 功能简介 Faultlogger是OpenHarmony为开发者提供的一个维测日志框架,能够为应用、元能力、系统服务进程崩溃故障提供统一检测、日志采集、日志存储、日志上报功能…...
C# virtual 和 abstract 详解
简介 在 C# 中,virtual 和 abstract 关键字都用于面向对象编程中的继承和多态,它们主要用于方法、属性和事件的定义,但在用法上存在一些重要的区别。 virtual 关键字 virtual 表示可重写的方法,但可以提供默认实现,…...
红宝书第三十二讲:零基础学会模块打包器:Webpack、Parcel、Rollup
红宝书第三十二讲:零基础学会模块打包器:Webpack、Parcel、Rollup 资料取自《JavaScript高级程序设计(第5版)》。 查看总目录:红宝书学习大纲 一、模块打包器是什么? 把分散的HTML/CSS/JS文件 组合成浏览…...
DeepSeek 在金融领域的应用解决方案
DeepSeek 在金融领域的应用解决方案 一、背景 随着人工智能技术的快速发展,DeepSeek 作为一款国产大模型,凭借其强大的语义理解、逻辑推理和多模态处理能力,在金融行业迅速崭露头角。金融行业作为经济的核心,面临着激烈的市场竞…...
linux 处理2个文件的差集
命令 grep -Fvxf 文件1 文件2 -F 将模式视为固定字符串,而非正则表达式。 -v 反向匹配,输出不匹配的行。 -x 精确匹配整行,避免部分匹配。 -f 文件1 从文件1中读取模式。 示例 执行命令 grep -Fvxf a1.txt a2.txt...
vue3中pinia基本使用
一、安装以及引入 安装:npm install piniamain.js文件: import { createApp } from "vue"; import { createPinia } from "pinia"; import App from "./App.vue";const pinia createPinia() const app createApp(App)…...
“乐企“平台如何重构业财税票全流程生态?
2025年,国家税务总局持续推进的"便民办税春风行动"再次推进数字化服务升级,其中"乐企"平台作为税务信息化的重要载体,持续优化数电票服务能力,为企业提供更高效、更规范的税务管理支持。在这一背景下…...
JVM内存模型
JVM内存模型 JVM(Java Virtual Machine)内存模型是 Java 程序在运行时,JVM 为其分配的内存结构,它定义了 Java 程序如何在内存中存储数据和如何进行线程之间的通信。JVM 内存模型是为了支持高效的多线程执行和垃圾回收机制。 一…...
LeetCode热题100记录-【二分查找】
二分查找 35.搜索插入位置 思考:二分查找先判定边界条件 记录:不需要二刷 class Solution {public int searchInsert(int[] nums, int target) {int left 0,right nums.length-1;if(nums[right] < target){return right1;}if(nums[left] > tar…...
科普:原始数据是特征向量么?
一、输入向量 x \mathbf{x} x是特征向量 机器学习算法公式中的输入向量 x \mathbf{x} x通常要求是特征向量。原因如下: 从算法原理角度:机器学习算法旨在通过对输入数据的学习来建立模型,以实现对未知数据的预测或分类等任务。特征向量是对…...
echarts地图添加涟漪波纹点位
1.完整代码 chartsOption: {tooltip: {trigger: "item",formatter: this.initTooltip,triggerOn: "mousemove",borderColor: "#fff",backgroundColor: "rgba(216, 227, 244, 1)",extraCssText: "border-radius: 14px;", //…...
Linux(十三)fork + exec进程创建
一、进程创建 在了解进程创建的步骤前,让我们先通过实例观察一下。大家可以跟小编一起,在终端中执行3次ps -f命令,观察一下。 通过上图,我们可以发现,3次ps -f的父进程(PPID)都是一样的…...
集合计算高级函数
说明 过滤 遍历一个集合并从中获取满足指定条件的元素组成一个新的集合转化/映射(map)将集合中的每一个元素映射到某一个函数扁平化 扁平化映射 注:flatMap 相当于先进行 map 操作,在进行 flatten 操作集合中的每个元素的子元素映…...
鼎讯信通 便携式雷达信号干扰模拟器:打造实战化电磁环境的新利器
在现代战争中,电磁环境的复杂性直接影响着雷达装备的性能和作战效果。面对敌方日益精进的电子战手段,如何提升雷达设备的抗干扰能力,确保其在实战环境中的稳定性和可靠性,已成为各国军队和科研机构的重要课题。 为此,…...
避开养生误区,拥抱健康生活
在追求健康的道路上,我们常常会陷入一些养生误区,不仅无法达到预期效果,还可能损害身体健康。只有拨云见日,认清这些误区,采取正确的养生方式,才能真正拥抱健康生活。 很多人认为,保健品吃得…...
解码ChatBI技术形态:独立对话框、插件式与IM集成模式的技术优劣
ChatBI的形态之争 随着大语言模型(LLM)技术的成熟,**对话式商业智能(ChatBI)**正成为企业数据分析的新范式。然而,不同的技术形态直接影响ChatBI的落地效果——独立对话框、插件式助手、IM集成机器人&…...