鸿蒙媒体开发系列01——资源分类访问

news2024/9/19 20:12:46

 如果你也对鸿蒙开发感兴趣,加入“Harmony自习室”吧!扫描下方名片,关注公众号,公众号更新更快,同时也有更多学习资料和技术讨论群。

1、概述

应用开发过程中,经常需要用到颜色、字体、间距、图片等资源,在不同的设备或配置中,这些资源的值可能不同。

  • 应用资源:借助资源文件能力,开发者在应用中自定义资源,自行管理这些资源在不同的设备或配置中的表现。

  • 系统资源:开发者直接使用系统预置的资源定义。

2、资源分类

应用开发中使用的各类资源文件,需要放入特定子目录中存储管理。资源目录的示例如下所示,base目录、限定词目录、rawfile目录、resfile目录称为资源目录,element、media、profile称为资源组目录。

【注意:stage模型多工程情况下,共有的资源文件放到AppScope下的resources目录】

资源目录示意图如下:

图片

下面对目录结构做一些基本的解释:

👉🏻 base目录

base目录是默认存在的目录,二级子目录element用于存放字符串、颜色、布尔值等基础元素,media、profile存放媒体、动画、布局等资源文件。

目录中的资源文件会被编译成二进制文件,并赋予资源文件ID。通过指定资源类型(type)和资源名称(name)引用。

👉🏻 rawfile目录

支持创建多层子目录,子目录名称可以自定义,文件夹内可以自由放置各类资源文件。

目录中的资源文件会被直接打包进应用,不经过编译,也不会被赋予资源文件ID。通过指定文件路径和文件名引用。

👉🏻 限定词目录

en_US和zh_CN是默认存在的两个限定词目录,其余限定词目录需要开发者根据开发需要自行创建。二级子目录element、media、profile用于存放字符串、颜色、布尔值等基础元素,以及媒体、动画、布局等资源文件。

同样,目录中的资源文件会被编译成二进制文件,并赋予资源文件ID。通过指定资源类型(type)和资源名称(name)来引用。

限定词目录可以由一个或多个表征应用场景或设备特征的限定词组合而成,包括移动国家码和移动网络码、语言、文字、国家或地区、横竖屏、设备类型、颜色模式和屏幕密度等维度,限定词之间通过下划线(_)或者中划线(-)连接。开发者在创建限定词目录时,需要遵守限定词目录的命名规则。

    • 限定词的组合顺序:_移动国家码_移动网络码-语言_文字_国家或地区-横竖屏-设备类型-颜色模式-屏幕密度_。开发者可以根据应用的使用场景和设备特征,选择其中的一类或几类限定词组成目录名称。

    • 限定词的连接方式:语言、文字、国家或地区之间采用下划线(_)连接,移动国家码和移动网络码之间也采用下划线(_)连接,除此之外的其他限定词之间均采用中划线(-)连接。例如:zh_Hant_CN、zh_CN-car-ldpi。

    • 限定词的取值范围:每类限定词的取值必须符合限定词取值要求下表中的条件。

限定词类型

含义与取值说明

移动国家码和移动网络码

移动国家码(MCC)和移动网络码(MNC)的值取自设备注册的网络。

MCC可与MNC合并使用,使用下划线(_)连接,也可以单独使用。例如:mcc460表示中国,mcc460_mnc00表示中国_中国移动。

详细取值范围,请查阅ITU-T E.212(国际电联相关标准)。

语言

表示设备使用的语言类型,由2~3个小写字母组成。例如:zh表示中文,en表示英语,mai表示迈蒂利语。

详细取值范围,请查阅ISO 639(ISO制定的语言编码标准)。

文字

表示设备使用的文字类型,由1个大写字母(首字母)和3个小写字母组成。例如:Hans表示简体中文,Hant表示繁体中文。

详细取值范围,请查阅ISO 15924(ISO制定的文字编码标准)。

国家或地区

表示用户所在的国家或地区,由2~3个大写字母或者3个数字组成。例如:CN表示中国,GB表示英国。

详细取值范围,请查阅ISO 3166-1(ISO制定的国家和地区编码标准)。

横竖屏

表示设备的屏幕方向,取值如下:

- vertical:竖屏

- horizontal:横屏

设备类型

表示设备的类型,取值如下:

- phone:手机

- tablet:平板

- car:车机

- pc:电脑

- tv:智慧屏

- wearable:智能穿戴

- 2IN1

颜色模式

表示设备的颜色模式,取值如下:

- dark:深色模式

- light:浅色模式

屏幕密度

表示设备的屏幕密度(单位为dpi),取值如下:

- sdpi:表示小规模的屏幕密度(Small-scale Dots Per Inch),适用于dpi取值为(0, 120]的设备。

- mdpi:表示中规模的屏幕密度(Medium-scale Dots Per Inch),适用于dpi取值为(120, 160]的设备。

- ldpi:表示大规模的屏幕密度(Large-scale Dots Per Inch),适用于dpi取值为(160, 240]的设备。

- xldpi:表示特大规模的屏幕密度(Extra Large-scale Dots Per Inch),适用于dpi取值为(240, 320]的设备。

- xxldpi:表示超大规模的屏幕密度(Extra Extra Large-scale Dots Per Inch),适用于dpi取值为(320, 480]的设备。

- xxxldpi:表示超特大规模的屏幕密度(Extra Extra Extra Large-scale Dots Per Inch),适用于dpi取值为(480, 640]的设备。

我们将放在base目录与限定词目录下的所有资源目录,称为“资源组目录”,资源组目录包括element、media、profile三种类型的资源文件(参看上文中的资源目录示意图),用于存放特定类型资源。说明如下:

目录类型

说明

资源文件

element

表示元素资源,以下每一类数据都采用相应的JSON文件来表征(目录下仅支持文件类型)。

- boolean,布尔型

- color,颜色

- float,浮点型,范围是-2^128-2^128

- intarray,整型数组

- integer,整型,范围是-2^31-2^31-1

- plural,复数形式

- strarray,字符串数组

- string,字符串

element目录中的文件名称建议与下面的文件名保持一致。每个文件中只能包含同一类型的数据。

- boolean.json

- color.json

- float.json

- intarray.json

- integer.json

- plural.json

- strarray.json

- string.json

media

表示媒体资源,包括图片、音频、视频等非文本格式的文件(目录下只支持文件类型)。

图片和音视频的类型说明见表4和表5。

文件名可自定义,例如:icon.png。

profile

表示自定义配置文件,目录下只支持json文件类型

文件名可自定义,例如:test_profile.json。

图片支持的格式有:JPEG(.jpg)、PNG(.png)、GIF(.gif)、SVG(.svg)、WEBP(.webp)、BMP(.bmp)

音视频支持的格式有:H.264 AVC(.3gp)、Baseline Profile(.mp4)

3、创建资源目录与资源文件

在resources目录下,可按照限定词目录命名规则,以及资源组目录支持的文件类型和说明,创建资源目录和资源组目录,添加特定类型资源。DevEco Studio支持同时创建资源目录和资源文件,也支持单独创建资源目录或资源文件。

3.1、创建资源目录

在resources目录右键菜单选择“New > Resource Directory”,可创建资源目录,默认创建的是base目录。如果选择了限定词,则会按照命名规范自动生成限定词和资源组目录。确定限定词后,选择资源组类型,当前资源组类型支持Element、Media、Profile三种,创建后生成资源目录。

图片

3.2、创建资源文件

在资源目录(element、media、profile)的右键菜单选择“New > XXX Resource File”,即可创建对应资源组目录的资源文件。例如,在element目录下可新建Element Resource File。

图片

3.3、同时创建资源目录与资源文件

在resources目录右键菜单选择“New > Resource File”,可同时创建资源目录和资源文件,文件默认创建在base目录的对应资源组。如果选择了限定词,则会按照命名规范自动生成限定词和资源组目录,并将文件创建在限定词目录中。

图中File name为需要创建的文件名。Resource type为资源组类型,默认是element。Root Element为资源类型。Avaliable qualifiers为供选择的限定词目录,通过右边的小箭头可添加或者删除。

创建的目录名自动生成,格式固定为“限定词.资源组”,例如:创建一个限定词为dark的element目录,自动生成的目录名称为“dark.element”。

图片

4、资源的访问

4.1、单HAP包应用资源场景

单HAP指的是没有跨HAP包的情况下,即所有资源都是在同一个module中(一般情况下单HAP比较常见)。

有两种方式访问资源

👉🏻 方式1:通过"$r"或"$rawfile"引用资源。

对于“color”、“float”、“string”、“plural”、“media”、“profile”等类型的资源,通过"$r('app.type.name')"形式引用。其中,app为resources目录中定义的资源;type为资源类型或资源的存放位置;name为资源名,开发者定义资源时确定。

对于 string.json 中使用多个占位符的情况, 通过$r('app.string.label','aaa','bbb',444)形式引用。

对于rawfile目录资源,通过"$rawfile('filename')"形式引用。其中,filename为rawfile目录下文件的相对路径,文件名需要包含后缀,路径开头不可以"/"开头。

示例代码如下(app开头表示是我们自己定义的内容,sys是系统的资源):

  Text('Hello')  .fontColor($r('app.color.myColor1'))  .fontSize($r('app.float.h1'))  .fontFamily($r('sys.string.ohos_id_text_font_family_medium'))  .backgroundColor($r('sys.color.ohos_id_color_palette_aux1'))  Image($r('app.media.icon'))  .border({    color: $r('sys.color.ohos_id_color_palette_aux1'),    radius: $r('sys.float.ohos_id_corner_radius_button'), width: 2  })  .margin({    top: $r('app.float.marginTop'),    bottom: $r('sys.float.ohos_id_elements_margin_horizontal_l')  })  .height(200)  .width(300)

👉🏻 方式2:通过本应用上下文获取ResourceManager后,调用不同资源管理接口访问不同资源。

例如:

getContext().resourceManager.getStringByNameSync('test') 可获取字符串资源;

getContext().resourceManager.getRawFd('rawfilepath') 可获取Rawfile所在hap包的descriptor信息,访问rawfile文件时需{fd, offset, length}一起使用。

4.2、跨HAP包应用资源场景

👉🏻 方式1:通过createModuleContext(moduleName)接口创建同应用中不同module的上下文,获取resourceManager对象后,调用不同接口访问不同资源。

例如:getContext().createModuleContext(moduleName).resourceManager.getStringByNameSync('test')。

👉🏻 方式2:通过"$r"或"$rawfile"引用资源。具体操作如下:

1.这里是列表文本[hsp].type.name获取资源。其中,hsp为hsp模块名,type为资源类型,name为资源名称,示例如下:

  •   Text($r('[hsp].string.test_string'))    .fontSize($r('[hsp].float.font_size'))    .fontColor($r('[hsp].color.font_color'))    Image($rawfile('[hsp].icon.png'))​​​​​​​

2.使用变量获取资源。示例如下:​​​​​​​

 @Entry @Component struct Index {   text: string = '[hsp].string.test_string';   fontSize: string = '[hsp].float.font_size';   fontColor: string = '[hsp].color.font_color';   image: string = '[hsp].media.string';   rawfile: string = '[hsp].icon.png';   build() {     Row() {       Text($r(this.text))         .fontSize($r(this.fontSize))         .fontColor($r(this.fontColor))       Image($r(this.image))       Image($rawfile(this.rawfile))     }   } }

注意:hsp包名必须写在[]内,rawfile下有多层目录,需要从rawfile下面第一个目录开始写,如"\$rawfile('[hsp].oneFile/twoFile/icon.png')",使用"$r"和"$rawfile"跨包访问HSP包资源无法提供编译时的资源校验,需要开发者自行保证使用资源存在于对应包中。

4.3、访问系统资源

除了自定义资源,开发者也可以使用系统中预定义的资源,统一应用的视觉风格。

在开发过程中,分层参数的用法与资源限定词基本一致。对于系统资源,可以通过“$r('sys.type.resource_id')”的形式引用。其中,sys为系统资源;type为资源类型,取值包括“color”、“float”、“string”、“media”;resource_id为资源id。

代码示例如下:​​​​​​​

Text('Hello')  .fontColor($r('sys.color.ohos_id_color_emphasize'))  .fontSize($r('sys.float.ohos_id_text_size_headline1'))  .fontFamily($r('sys.string.ohos_id_text_font_family_medium'))  .backgroundColor($r('sys.color.ohos_id_color_palette_aux1'))Image($r('sys.media.ohos_app_icon'))  .border({    color: $r('sys.color.ohos_id_color_palette_aux1'),    radius: $r('sys.float.ohos_id_corner_radius_button'), width: 2  })  .margin({    top: $r('sys.float.ohos_id_elements_margin_horizontal_m'),    bottom: $r('sys.float.ohos_id_elements_margin_horizontal_l')  })  .height(200)  .width(300)

5、资源的匹配规则

应用使用某资源时,系统会根据当前设备状态优先从相匹配的限定词目录中寻找该资源。只有当resources目录中没有与设备状态匹配的限定词目录,或者在限定词目录中找不到该资源时,才会去base目录中查找。rawfile是原始文件目录,不会根据设备状态去匹配不同的资源。

5.1、限定词目录与设备状态的匹配规则

  • 在为设备匹配对应的资源文件时,限定词目录匹配的优先级从高到低依次为:移动国家码和移动网络码 > 区域(可选组合:语言、语言_文字、语言_国家或地区、语言_文字_国家或地区)> 横竖屏 > 设备类型 > 颜色模式 > 屏幕密度。

  • 如果限定词目录中包含移动国家码和移动网络码、语言、文字、横竖屏、设备类型、颜色模式限定词,则对应限定词的取值必须与当前的设备状态完全一致,该目录才能够参与设备的资源匹配。例如,限定词目录“zh_CN-car-ldpi”不能参与“en_US”设备的资源匹配。

  • 如果存在多个屏幕密度限定词目录,则优先向上匹配最接近的屏幕密度限定词目录,否则向下匹配最为接近的屏幕密度限定词目录。例如,假设存在限定词目录“xldpi”和“xxldpi”,设备屏幕密度为“xxldpi”,则会匹配“xxldpi”限定词目录。

5.2、获取指定配置的资源

开发者可以在工程的resource目录下添加限定词目录,满足多语言、深浅色模式等不同类型的系统设置。然而,在获取资源时,由于限定词目录匹配规则,只能筛选出最匹配的资源,无法获取其它目录资源。

应用如果有获取指定配置的资源的诉求,可以通过以下方法进行获取。

接口名

描述

getOverrideResourceManager(configuration?: Configuration) : ResourceManager

获取可以加载指定配置的资源的资源管理对象,使用同步方式返回。

getOverrideConfiguration() : Configuration

获取指定的配置,使用同步方式返回

updateOverrideConfiguration(configuration: Configuration) : void

更新指定的配置

举例:

假设工程中中文、英文、德文的资源目录定义了如下同名资源:

  • entry/src/main/resources/zh_CN/element/string.json

  • {  "string": [    {      "name": "greetings",      "value": "你好,世界"    }  ]}
  • entry/src/main/resources/en_US/element/string.json

{  "string": [    {      "name": "greetings",      "value": "Hello, world"    }  ]}
  • entry/src/main/resources/de_DE/element/string.json

  • {  "string": [    {      "name": "greetings",      "value": "Hallo, Welt"    }  ]}

在Index.ets中,分别获取三种语言的资源并显示在文本框中,运行设备当前系统语言为中文,entry/src/main/ets/pages/Index.ets的代码如下:​​​​​​​

@Entry@Componentstruct Index {  @State englishString: string = ""  @State germanString: string = ""  getString(): string {    let resMgr = getContext().resourceManager    let resId = $r('app.string.greetings').id    //获取符合当前系统语言地区、颜色模式、分辨率等配置的资源    let currentLanguageString = resMgr.getStringSync(resId)    //获取符合当前系统颜色模式、分辨率等配置的英文资源    let overrideConfig = resMgr.getOverrideConfiguration()    overrideConfig.locale = "en_US" //指定资源的语言为英语,地区为美国    let overrideResMgr = resMgr.getOverrideResourceManager(overrideConfig)    this.englishString = overrideResMgr.getStringSync(resId)    //获取符合当前系统颜色模式、分辨率等配置的德文资源    overrideConfig.locale = "de_DE" //指定资源的语言为德语,地区为德国    overrideResMgr.updateOverrideConfiguration(overrideConfig) //等效于resMgr.updateOverrideConfiguration(overrideConfig)    this.germanString = overrideResMgr.getStringSync(resId)    return currentLanguageString  }  build() {    Row() {      Column() {        Text(this.getString())          .fontSize(50)          .fontWeight(FontWeight.Bold)        Text(this.englishString)          .fontSize(50)          .fontWeight(FontWeight.Bold)        Text(this.germanString)          .fontSize(50)          .fontWeight(FontWeight.Bold)      }      .width('100%')    }    .height('100%')  }}

5.3、overlay机制

overylay是一种资源替换机制,针对不同品牌、产品的显示风格,开发者可以在不重新打包业务逻辑hap的情况下,通过配置和使用overlay资源包,实现应用界面风格变换。overlay资源包只包含资源文件、资源索引文件和配置文件。

  • 动态overlay使用方式

    1、对应的overlay资源包需要放在对应应用安装路径下,通过hdc install的方式安装。如应用com.example.overlay的安装路径:data/app/el1/bundle/public/com.example.overlay/。

    2、应用通过addResource(path),实现资源覆盖;通过removeResource(path),实现overlay删除。overlay资源路径需经过元能力的getContext().BundleCodeDir获取此应用对应的沙箱根目录,由应用的沙箱根目录+overlay资源包名称组成。如:let path = getContext().bundleCodeDir + "overlay资源包名称",其对应沙箱路径为:/data/storage/el1/bundle/overlay资源包名称。

  • 静态overlay配置方式

包内overlay资源包中的配置文件module.json5中支持的字段:​​​​​​​

  "app":{    "bundleName": "com.example.myapplication.overlay",    "vendor" : "example",    "versinCode": "1000000",    "versionName": "1.0.0.1",    "icon": "$media:app_icon",    "label": "$string:app_name",  },  "module":{    "name": "entry_overlay_module_name",    "type": "shared",    "description": "$string:entry_overlay_desc",    "deviceTypes": [      "default",      "tablet",    ],    "deliverywithInstall": true,    "targetModuleName": "entry_module_name",    "targetPriority": 1,  }}
  • targetBundleName: 字符串类型,指定要overlay的bundleName。

  • targetModuleName: 字符串类型,指定要overlay的应用中的目标module。

  • targetPriority:整数类型,指定overlay优先级。

  • 不支持Ability、ExtensionAbility、Permission等其他字段的配置。

  • overlay不支持json类型的图片配置。

在IDE中创建应用工程时,module的配置文件module.json5中包含targetModuleName和targetPriority字段时,该module将会在安装阶段被识别为overlay特征的module。overlay特征的module一般是为设备上存在的非overlay特征的module提供覆盖的资源文件,以便于targetModuleName指向的module在运行阶段可以使用overlay资源文件展示不同的颜色,标签,主题等等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2141007.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录刷题day34丨 62.不同路径 ,63. 不同路径 II

代码随想录刷题day34丨 62.不同路径 ,63. 不同路径 II 1.题目 1.1不同路径 题目链接:62. 不同路径 - 力扣(LeetCode) 视频讲解:动态规划中如何初始化很重要!| LeetCode:62.不同路径_哔哩哔哩…

【Linux】-基本指令(上)

🔑🔑博客主页:阿客不是客 🍓🍓系列专栏:深入代码世界,了解掌握 Linux 欢迎来到泊舟小课堂 😘博客制作不易欢迎各位👍点赞⭐收藏➕关注 与Windows环境不同,我们…

ASCII字符和中文字符的显示

目录 前言 ASCII字符的点阵显示 获取点阵 描点 main 中文字符的点阵显示 指定编码格式 汉字区位码 汉字点阵显示实验 打开汉字库文件 编写显示汉字的函数 使用 lcd_put_chinese 函数 前言 板子为韦东山老师的imx6ull板,要在LCD上实现字符的显示&#xf…

idea集成和使用Git指南

前言 Git是一个分布式的版本控制工具,可以管理我们开发过程中的源代码文件,而idea是Java的集成开发环境,在idea中配置Git,可以提高我们的团队开发效率。因此在idea中集成Git并使用Git管理我们的源代码是必要的 第一步:…

多线程的高手——海王(浅谈线程概念)

听到大海的声音了吗 让我想想炉石里面能被成为海王的卡牌 我个人感觉 就是拿着三叉戟的甲壳元素 可是这牌被删了我心痛 背景知识 还是地址空间那点破事! OS进行内存管理,不是以字节为单位的,而是以内存块为单位的! 默认是4k…

Halo 开发者指南——项目运行、构建

准备工作 环境要求 OpenJDK 17 LTSNode.js 20 LTSpnpm 9IntelliJ IDEAGitDocker(可选) 名词解释 工作目录 指 Halo 所依赖的工作目录,在 Halo 运行的时候会在系统当前用户目录下产生一个 halo-next 的文件夹,绝对路径为 ~/ha…

学习图解算法 使用C语言

图解算法 使用C语言 也就是通过C语言实现各种算法 链接:百度云盘 提取码:1001

【CMake】使用CMake在Visual Stdudio构建一个最简单的项目

一、准备工作 首先,确保在 V i s u a l S t u d i o Visual\ Studio Visual Studio上安装了 C C C桌面开发,如果没有安装,打开 V i s u a l S t u d i o I n s t a l l e r Visual\ Studio\ Installer Visual Studio Installer就可以修改…

【JAVA干货店】带你玩转数组与递归

🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 ​💫个人格言:“没有罗马,那就自己创造罗马~” 文章目录 递归利用递归求斐波那契数列数组入门 递归 自己调用自己 StackOverflowError:栈溢出错误,出现的原…

滑动窗口(3)_最大连续1的数组个数III

个人主页:C忠实粉丝 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C忠实粉丝 原创 滑动窗口(3)_最大连续1的数组个数III 收录于专栏【经典算法练习】 本专栏旨在分享学习算法的一点学习笔记,欢迎大家在评论区交流讨论💌 …

CTFHub技能树-信息泄露-HG泄漏

目录 漏洞产生原因 解题过程 当开发人员使用 Mercurial 进行版本控制,对站点自动部署。如果配置不当,可能会将.hg 文件夹直接部署到线上环境。这就引起了 hg 泄露漏洞。 漏洞产生原因 Mercurial(hg)是一种分布式版本控制系统,它与Git类似也可以用于管…

【Java】线程状态:线程生命周期的六个阶段

欢迎浏览高耳机的博客 希望我们彼此都有更好的收获 感谢三连支持! 在Java中,线程可以处于多种状态,这些状态描述了线程的生命周期。了解这些状态及其转换条件对于编写高效且无错误的多线程应用程序至关重要。本文将总结Java线程的几种状态&am…

半导体制造技术中的沉积和驱入(Deposition and drive-in)过程

来源:半导体制造技术导论——萧宏 沉积和驱入过程 图5.34 硼掺杂工艺高温扩散炉系统示意图 图5.35 扩散掺杂工艺流程 图5.36 扩散工艺在超浅结深(USJ)上的应用

C++设计模式——Prototype Pattern原型模式

一,原型模式的定义 原型模式是一种创建型设计模式,它允许通过克隆已有对象来创建新对象,从而无需调用显式的实例化过程。 原型模式的设计,使得它可以创建一个与原型对象相同或类似的新对象,同时又可以减少对象实例化…

项目实战应用Redis分布式锁

Redis分布式锁 一、前言二、Redis分布式锁过期处理三、Redis分布式实现3.1 基于Jedis 的API实现分布式锁3.1.1 基础命令3.1.2 基于Jedis API的分布式锁3.1.3 基于Lua脚本实现分布式锁 四、Redisson的使用五、Redision锁 核心源码分析六、总结 一、前言 对于项目中使用Redis分布…

jdk相关介绍

JDK,全称Java Development Kit,是Java语言开发的基础工具包。它包含了Java运行时环境(JRE)以及用于开发Java应用程序的各种工具和库。JDK为Java程序员提供了编译、调试和运行Java应用程序所需的全部环境。 JDK的主要组成部分包括&…

OpenCV_图像像素读写操作

本文详细介绍了如何在C项目中使用OpenCV进行图像像素的读写操作,包括使用头文件声明Pixel类,通过遍历和指针方式处理灰度图和彩色图,以及在主函数中调用这些操作。 数组遍历的方式进行图像像素读写 void QuickDemo::pixelVisit_Demo(Mat&am…

【最新华为OD机试E卷-支持在线评测】增强的strstr(100分)多语言题解-(Python/C/JavaScript/Java/Cpp)

🍭 大家好这里是春秋招笔试突围 ,一枚热爱算法的程序员 💻 ACM金牌🏅️团队 | 大厂实习经历 | 多年算法竞赛经历 ✨ 本系列打算持续跟新华为OD-E/D卷的多语言AC题解 🧩 大部分包含 Python / C / Javascript / Java / Cpp 多语言代码 👏 感谢大家的订阅➕ 和 喜欢�…

替换 Oracle ,江河信息用 TDengine 解决高基数查询写入问题

在数字经济快速发展的背景下,智慧水利作为重要的基础设施之一,正逐步成为提升水资源管理效率、优化生态环境的重要力量。江西省水投江河信息技术有限公司(以下简称“江河信息”)作为高新技术国有企业,坚定致力于打造数…

监控binlog日志监控表变化进行消息通知

前言 由于我们做项目的时候有项目任务管理工具,目前用的最多的是禅道,而我们用的是redmine,而redmine是使用ruby写的,刚好我们这边没有会用ruby的人,所以就有了这样一个小工具,用于监控binlog日志通过钉钉…