展开菜单
首页 精品内容 本月促销 装机必备 Windows PDF教程 macOS软件 IOS软件 Android AI 专题
全部分类

当前位置:

首页 > 编程开发 > SpringBoot整合Jackson的方法是什么

SpringBoot整合Jackson的方法是什么

一、Jackson简介说明:本篇讲的是Jackson的详细用法,Jackson工具类在文章最后,直接复制粘贴即可使用。Jackson是公司中必用的组件之一,常用的还用阿里的Fastjson,但是由于一些原因bug与漏洞是在是太多,在注重安全的公司直接被pass,还有就是谷歌的Gson(这个没用过不太了解)。SpringMVC的默认json解析器便是Jackson。Jackson优点很多。Jackson所依赖的jar包较少,简单易用。与其他Java的json的框架Gson等相比,Jackson解析大的jso

本文目录

    一、Jackson简介

    说明:本篇讲的是Jackson的详细用法,Jackson工具类在文章最后,直接复制粘贴即可使用。 Jackson是公司中必用的组件之一,常用的还用阿里的Fastjson,但是由于一些原因bug与漏洞是在是太多,在注重安全的公司直接被pass,还有就是谷歌的Gson(这个没用过不太了解)。 Spring MVC 的默认 json 解析器便是 Jackson。 Jackson 优点很多。 Jackson 所依赖的 jar 包较少 ,简单易用。与其他 Java 的 json 的框架 Gson 等相比, Jackson 解析大的 json 文件速度比较快;Jackson 运行时占用内存比较低,性能比较好;Jackson 有灵活的 API,可以很容易进行扩展和定制。

    额外了解:
    Jackson 的 1.x 版本的包名是 org.codehaus.jackson ,
    当升级到 2.x 版本时,包名变为com.fasterxml.jackson。

    Jackson 有三个核心包,分别是 Streaming、Databid、Annotations,通过这些包可以方便的对 JSON 进行操作.

    • jackson-core:核心包,提供基于"流模式"解析的相关 API,它包括 JsonPaser 和 JsonGenerator。 Jackson 内部实现正是通过高性能的流模式 API 的 JsonGenerator 和 JsonParser 来生成和解析 json。

    • jackson-annotations:注解包,提供标准注解功能.

    • jackson-databind :数据绑定包, 提供基于"对象绑定" 解析的相关 API ( ObjectMapper ) 和"树模型" 解析的相关 API (JsonNode);基于"对象绑定" 解析的 API 和"树模型"解析的 API 依赖基于"流模式"解析的 API。包含上面两个包,只导入这个坐标即可。

    运行环境:

    • idea2020.2

    • jdk1.8

    • springboot 2.7.9

    下载demo:直接去我的资源下载即可(Jackson实例-附工具类)

    二、Json简介

    说明: 作为Java开发一定要学习Json,在现在的前后端分离的项目中,Json是最常见的数据交换格式。比如SpringBoot中@RequestBody注解就是作为接收Json格式的注解,在使用Postman进行测试时传输的raw-json也是Json格式数据。

    JSON表示结构:
    对象数组: 对象结构以”{”大括号开始,以”}”大括号结束,中间部分由0或多个以”,”分隔的”key(关键字)/value(值)”对构成,关键字和值之间以”:”分隔,语法结构如代码。这里给一个示例。

    {
      "array": [1,2,3],
      "boolean": true,
      "name": "cllb",
      "null": null,
      "age": 12345,
      "object": {
        "height": 100,
        "color": "红色"
      },
      "string": "陈老老老板"
    }

    三、springboot整合Jackson

    1.创建项目

    说明: 创建一个空springboot项目(2.7.9版本)。这里就不过多复述了,创建时将lombok组件选上,十分方便无需再写Get/Set方法。
    注意:可以看到导入databind包会自动导入剩下两个包。

    SpringBoot整合Jackson的方法是什么

    2.导入坐标

    说明: 可以看到导入databind包会自动导入剩下两个包。

    
        com.fasterxml.jackson.core
        jackson-databind
        2.13.3
    

    SpringBoot整合Jackson的方法是什么

    3.配置文件

    a.配置文件配置

    properties格式:

    #指定日期格式,比如yyyy-MM-dd HH:mm:ss,或者具体的格式化类的全限定名
    spring.jackson.date-format
    #指定日期格式化时区,比如America/Los_Angeles或者GMT+10.
    spring.jackson.time-zone
    #是否开启Jackson的反序列化
    spring.jackson.deserialization
    #是否开启json的generators.
    spring.jackson.generator
    #指定Joda date/time的格式,比如yyyy-MM-ddHH:mm:ss). 如果没有配置的话,dateformat会作为backup
    spring.jackson.joda-date-time-format
    #指定json使用的Locale.
    spring.jackson.locale
    #是否开启Jackson通用的特性.
    spring.jackson.mapper
    #是否开启jackson的parser特性.
    spring.jackson.parser
    #指定PropertyNamingStrategy(CAMEL_CASE_TO_LOWER_CASE_WITH_UNDERSCORES)或者指定PropertyNamingStrategy子类的全限定类名.
    spring.jackson.property-naming-strategy
    #是否开启jackson的序列化.
    spring.jackson.serialization
    #指定序列化时属性的inclusion方式,具体查看JsonInclude.Include枚举.
    spring.jackson.serialization-inclusion

    yml格式:

    spring:
      jackson:
        #日期格式化
        date-format: yyyy-MM-dd HH:mm:ss
        time-zone: GMT+8
        #设置空如何序列化
        default-property-inclusion: non_null    
        serialization:
           #格式化输出 
          indent_output: true
          #忽略无法转换的对象
          fail_on_empty_beans: false
        deserialization:
          #允许对象忽略json中不存在的属性
          fail_on_unknown_properties: false
        parser:
          #允许出现特殊字符和转义符
          allow_unquoted_control_chars: true
          #允许出现单引号
          allow_single_quotes: true

    b.自定义配置

    说明: 这里直接将Jackson工具类给大家,自定义配置指的就是工具类中,对于object_mapper的set赋值。什么方法都有,演示也直接使用工具类进行。

    package com.clllb.jackson.utils;
    
    import com.fasterxml.jackson.annotation.JsonInclude;
    import com.fasterxml.jackson.core.JsonProcessingException;
    import com.fasterxml.jackson.core.type.TypeReference;
    import com.fasterxml.jackson.databind.*;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.util.StringUtils;
    
    import java.io.File;
    import java.io.IOException;
    import java.text.SimpleDateFormat;
    import java.util.List;
    
    @Slf4j
    public class JacksonUtil {
    
        private static final ObjectMapper OBJECT_MAPPER = new ObjectMapper();
    
        private static final ObjectMapper OBJECT_MAPPER_SNAKE_CASE = new ObjectMapper();
        // 日期格式化
        private static final String STANDARD_FORMAT = "yyyy-MM-dd HH:mm:ss";
    
        static {
            //对象的所有字段全部列入
            OBJECT_MAPPER.setSerializationInclusion(JsonInclude.Include.ALWAYS);
            //取消默认转换timestamps形式
            OBJECT_MAPPER.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
            //忽略空Bean转json的错误
            OBJECT_MAPPER.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
            //所有的日期格式都统一为以下的样式,即yyyy-MM-dd HH:mm:ss
            OBJECT_MAPPER.setDateFormat(new SimpleDateFormat(STANDARD_FORMAT));
            //忽略 在json字符串中存在,但是在java对象中不存在对应属性的情况。防止错误
            OBJECT_MAPPER.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        }
    
        static {
            //对象的所有字段全部列入
            OBJECT_MAPPER_SNAKE_CASE.setSerializationInclusion(JsonInclude.Include.ALWAYS);
            //取消默认转换timestamps形式
            OBJECT_MAPPER_SNAKE_CASE.configure(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS, false);
            //忽略空Bean转json的错误
            OBJECT_MAPPER_SNAKE_CASE.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
            //所有的日期格式都统一为以下的样式,即yyyy-MM-dd HH:mm:ss
            OBJECT_MAPPER_SNAKE_CASE.setDateFormat(new SimpleDateFormat(STANDARD_FORMAT));
            //忽略 在json字符串中存在,但是在java对象中不存在对应属性的情况。防止错误
            OBJECT_MAPPER_SNAKE_CASE.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
            //转换为下划线
            OBJECT_MAPPER_SNAKE_CASE.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);
        }
    
        private JacksonUtil() {
        }
    
        /**
         * 对象转Json格式字符串
         *
         * @param obj 对象
         * @return Json格式字符串
         */
        public static  String obj2String(T obj) {
            if (obj == null) {
                return null;
            }
            try {
                return obj instanceof String ? (String) obj : OBJECT_MAPPER.writeValueAsString(obj);
            } catch (JsonProcessingException e) {
                log.warn("Parse Object to String error : {}", e.getMessage());
                return null;
            }
        }
    
        /**
         * 对象转file
         * @param fileName
         * @param obj
         */
         public static void obj2File(String fileName,Object obj){
            if (obj == null){
                return;
            }
             try {
                 OBJECT_MAPPER.writeValue(new File(fileName),obj);
             } catch (IOException e) {
                 e.printStackTrace();
             }
         }
    
        /**
         * 对象转Json格式字符串; 属性名从驼峰改为下划线形式
         *
         * @param obj 对象
         * @return Json格式字符串
         */
        public static  String obj2StringFieldSnakeCase(T obj) {
            if (obj == null) {
                return null;
            }
            try {
                ObjectMapper objectMapper = OBJECT_MAPPER_SNAKE_CASE;
                return obj instanceof String ? (String) obj : objectMapper.writeValueAsString(obj);
            } catch (JsonProcessingException e) {
                log.warn("Parse Object to String error : {}", e.getMessage());
                return null;
            }
        }
    
        /**
         * 字符串转换为自定义对象; 属性名从下划线形式改为驼峰
         *
         * @param str   要转换的字符串
         * @param clazz 自定义对象的class对象
         * @return 自定义对象
         */
        public static  T string2ObjFieldLowerCamelCase(String str, Class clazz) {
            if (StringUtils.isEmpty(str) || clazz == null) {
                return null;
            }
            try {
                ObjectMapper objectMapper = OBJECT_MAPPER_SNAKE_CASE;
                return clazz.equals(String.class) ? (T) str : objectMapper.readValue(str, clazz);
            } catch (Exception e) {
                log.warn("Parse String to Object error : {}", e.getMessage());
                return null;
            }
        }
    
        /**
         * 字符串转换为自定义对象(List); 属性名从下划线形式改为驼峰
         *
         * @param str           要转换的字符串
         * @param typeReference 自定义对象的typeReference List 对象
         * @return 自定义对象
         */
        public static  List string2ListFieldLowerCamelCase(String str, TypeReference> typeReference) {
            if (StringUtils.isEmpty(str) || typeReference == null) {
                return null;
            }
            try {
                ObjectMapper objectMapper = OBJECT_MAPPER_SNAKE_CASE;
                return objectMapper.readValue(str, typeReference);
            } catch (Exception e) {
                log.warn("Parse String to Object error : {}", e.getMessage());
                return null;
            }
        }
    
        /**
         * 对象转Json格式字符串(格式化的Json字符串)
         *
         * @param obj 对象
         * @return 美化的Json格式字符串
         */
        public static  String obj2StringPretty(T obj) {
            if (obj == null) {
                return null;
            }
            try {
                return obj instanceof String ? (String) obj : OBJECT_MAPPER.writerWithDefaultPrettyPrinter().writeValueAsString(obj);
            } catch (JsonProcessingException e) {
                log.warn("Parse Object to String error : {}", e.getMessage());
                return null;
            }
        }
    
        /**
         * 字符串转换为自定义对象
         *
         * @param str   要转换的字符串
         * @param clazz 自定义对象的class对象
         * @return 自定义对象
         */
        public static  T string2Obj(String str, Class clazz) {
            if (StringUtils.isEmpty(str) || clazz == null) {
                return null;
            }
            try {
                return clazz.equals(String.class) ? (T) str : OBJECT_MAPPER.readValue(str, clazz);
            } catch (Exception e) {
                log.warn("Parse String to Object error : {}", e.getMessage());
                return null;
            }
        }
    
        /**
         * 字符串转换为自定义字段转为list
         * @param str
         * @param typeReference
         * @param 
         * @return
         */
        public static  T string2Obj(String str, TypeReference typeReference) {
            if (StringUtils.isEmpty(str) || typeReference == null) {
                return null;
            }
            try {
                return (T) (typeReference.getType().equals(String.class) ? str : OBJECT_MAPPER.readValue(str, typeReference));
            } catch (IOException e) {
                log.warn("Parse String to Object error", e);
                return null;
            }
        }
    
        public static  T string2Obj(String str, Class collectionClazz, Class... elementClazzes) {
            JavaType javaType = OBJECT_MAPPER.getTypeFactory().constructParametricType(collectionClazz, elementClazzes);
            try {
                return OBJECT_MAPPER.readValue(str, javaType);
            } catch (IOException e) {
                log.warn("Parse String to Object error : {}" + e.getMessage());
                return null;
            }
        }
    }

    4.实体类

    说明: 这里创建一个user实体类

    package com.clllb.jackson.PO;
    
    import lombok.Data;
    
    import java.util.List;
    
    @Data
    public class User {
    
        private String username;
    
        private Integer age;
    
        private List info;
    
    	private Long userId;
    }

    项目样图:

    SpringBoot整合Jackson的方法是什么

    5.测试类

    说明: 测试类中直接调工具类中的方法,非常简单,附输出结果。

    a.object类型转Json

    说明: 使用writeValueAsString方法

      @Test
        void obj2string(){
            User user = new User();
            user.setUsername("clllb");
            user.setAge(24);
            user.setUserId(1L);
            List infoList = new ArrayList<>();
            infoList.add("有一百万");
            infoList.add("发大财");
            user.setInfo(infoList);
    
            String json = JacksonUtil.obj2String(user);
            System.out.println(json);
        }

    输出结果:

    {"username":"clllb","age":24,"info":["有一百万","发大财"],"userId":1}

    b.object类型转file

    说明: 使用writeValue方法

      @Test
        void obj2file(){
            User user = new User();
            user.setUsername("clllb");
            user.setAge(24);
            user.setUserId(1L);
            List infoList = new ArrayList<>();
            infoList.add("有一百万");
            infoList.add("发大财");
            user.setInfo(infoList);
            String fileName = "ccccc";
            JacksonUtil.obj2File(fileName,user);
        }

    输出结果:

    SpringBoot整合Jackson的方法是什么

    c.string类型转Object自定义类型

    说明: 使用readValue方法

     @Test
        void string2obj(){
            String json = "{\"username\":\"clllb\",\"age\":24,\"info\":[\"有一百万\",\"发大财\"],\"userId\":11}";
            User user = JacksonUtil.string2Obj(json, User.class);
            System.out.println(user);
        }

    输出结果:

    User(username=clllb, age=24, info=[有一百万, 发大财], userId=11)

    d.string类型转Object自定义类型list

    说明: 使用readValue方法,传参变为TypeReference typeReference,这里工具类用的重载方法名是相同的。

    @Test
        void string2objList(){
            String json = "[{\"username\":\"clllb\",\"age\":24,\"info\":[\"有一百万\",\"发大财\"],\"userId\":11},\n" +
                    "{\"username\":\"陈老老老板\",\"age\":25,\"info\":[\"有一千万\",\"发大大财\"],\"userId\":12}]";
            List user = JacksonUtil.string2Obj(json, new TypeReference>(){});
            user.forEach(System.out::println);
        }

    输出结果:

    User(username=clllb, age=24, info=[有一百万, 发大财], userId=11)
    User(username=陈老老老板, age=25, info=[有一千万, 发大大财], userId=12)

    e.object类型转String(驼峰转下划线)

    说明: 使用writeValueAsString方法,这里区别看工具类就会发现,就是多了一个设置OBJECT_MAPPER_SNAKE_CASE.setPropertyNamingStrategy(PropertyNamingStrategies.SNAKE_CASE);

     @Test
        void obj2sringSnakeCase(){
            User user = new User();
            user.setUsername("clllb");
            user.setAge(24);
            user.setUserId(11L);
            List infoList = new ArrayList<>();
            infoList.add("有一百万");
            infoList.add("发大财");
            user.setInfo(infoList);
            String json = JacksonUtil.obj2StringFieldSnakeCase(user);
            System.out.println(json);
        }

    输出结果:

    {"username":"clllb","age":24,"info":["有一百万","发大财"],"user_id":11}

    f.string类型(下划线)转Object类型

    说明: 使用readValue方法
    ```java
     @Test
        void string2obj(){
            String json = "{\"username\":\"clllb\",\"age\":24,\"info\":[\"有一百万\",\"发大财\"],\"user_id\":11}";
            User user = JacksonUtil.string2Obj(json, User.class);
            System.out.println(user);
        }

    输出结果:

    User(username=clllb, age=24, info=[有一百万, 发大财], userId=11)

    g.string类型(下划线)转Object自定义类型list

    说明: 使用readValue方法,传参变为TypeReference typeReference,这里工具类用的重载方法名是相同的。

     @Test
        void string2objSnakeCase(){
            String json = "[{\"username\":\"clllb\",\"age\":24,\"info\":[\"有一百万\",\"发大财\"],\"user_id\":11},\n" +
                    "{\"username\":\"陈老老老板\",\"age\":25,\"info\":[\"有一千万\",\"发大大财\"],\"user_id\":12}]";
            List user = JacksonUtil.string2ListFieldLowerCamelCase(json, new TypeReference>(){});
            user.forEach(System.out::println);
        }

    输出结果:

    User(username=clllb, age=24, info=[有一百万, 发大财], userId=11)
    User(username=陈老老老板, age=25, info=[有一千万, 发大大财], userId=12)

    本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系bd@zhengruan.com
    作者最新文章
    编程开发 jackson
    相关文章 更多
    精品专题 更多
    装机必备

    正软商城装机必备专区,精选办公、浏览器、安全防护、影音播放、压缩解压、设计创作和系统工具等电脑常用正版软件,帮助用户快速完成新电脑软件配置。

    Windows

    正软商城Windows软件专区,汇集适用于Windows电脑的办公、设计、安全防护、影音播放、开发工具和系统优化软件,提供软件介绍、系统要求、正版授权及购买下载服务。

    PDF教程

    正软商城PDF教程频道提供PDF编辑、转换、合并、拆分、压缩及格式处理方法,同时介绍常用PDF软件和工具的使用技巧。

    macOS软件

    正软商城macOS软件专区,精选适用于Mac电脑的办公、设计、影音、效率、开发和系统工具,提供软件功能介绍、macOS兼容版本、正版授权及购买下载服务。

    IOS软件

    正软商城iOS软件专区,精选适用于iPhone和iPad的办公、学习、影音、设计、效率及AI应用,提供功能介绍、适用设备、系统要求和正版获取方式等信息。

    AI

    正软商城AI软件专区,汇集AI写作、AI绘画、AI视频、AI办公、AI编程、AI翻译、智能客服和数据分析等人工智能工具,提供功能介绍、适用平台、收费方式及正版购买信息。

    Mac软件 更多
    AirBuddy 3 macOS版
    AirBuddy 3 macOS版

    AirBuddy 3 是面向 macOS 的蓝牙外设增强工具,可集中查看 AirPods、Beats 与苹果设备电量,提供快速连接、播放控制、电量提醒、桌面小组件和多台 Mac 外设接力等功能。

    AirServer macOS版
    AirServer macOS版

    AirServer macOS版可把 Mac 转换为无线投屏接收端,通过 AirPlay 或 Google Cast 接收手机、平板和电脑画面,并支持多设备同时连接、高清镜像及会话录制,适合家庭娱乐、课堂教学、会议演示和应用展示。

    AnyDesk macOS版
    AnyDesk macOS版

    AnyDesk macOS版是一款适用于远程办公、设备维护和客户支持的远程桌面工具,可连接并操作异地计算机,支持文件传输、无人值守访问、会话权限控制及跨平台协作。

    Beamer 4 macOS版
    Beamer 4 macOS版

    Beamer 4是面向macOS的本地视频投屏工具,可将Mac中的影片投放到Apple TV、Chromecast及兼容设备,支持常见格式、多类字幕、环绕声、播放列表和电视遥控操作。

    Boom 3D macOS版
    Boom 3D macOS版

    Boom 3D macOS版是一款系统级音效增强工具,可为音乐、电影、游戏和流媒体提供3D虚拟环绕声、31段均衡器、音量增强及应用独立音量控制,并支持本地播放器与多种音频输出设备。

    Boris FX macOS版
    Boris FX macOS版

    Boris FX macOS版是一套面向剪辑、合成、调色及动态图形工作的专业后期工具,涵盖视觉特效、平面与三维跟踪、转描、画面修复、粒子动画和音频清理,可配合多种主流宿主软件使用。

    Capto macOS版
    Capto macOS版

    Capto 是面向 macOS 的屏幕截图、高清录屏与媒体编辑工具,支持区域及整屏捕获、网页长截图、双音轨处理、图片和视频标注、素材分类与多渠道分享,适合教师、学生、内容创作者及需要制作演示教程的用户。

    ChemDraw macOS版
    ChemDraw macOS版

    ChemDraw macOS版是一款面向化学学习、科研和制药工作的专业结构绘图工具,可创建分子、反应及生物聚合物图形,并提供结构整理、格式转换和科研成果展示能力。

    Cursor Crane macOS版
    Cursor Crane macOS版

    Cursor Crane 是一款仅面向 macOS 的键盘操控效率工具,可通过提示标签、网格、文字查找和窗口模式完成点击、滚动、定位与切换,并支持屏幕内容提取、脚本及工作流扩展。

    Deep Freeze 冰点还原 macOS版
    Deep Freeze 冰点还原 macOS版

    Deep Freeze 冰点还原 macOS版通过冻结系统配置,让受保护的Mac在重新启动后回到预设状态,并提供解冻空间、维护计划、密码保护及Apple Remote Desktop管理能力。

    Focusky macOS版
    Focusky macOS版

    Focusky macOS版是一款面向教学课件、商务汇报、产品展示和动画宣传内容的演示制作工具。它通过无限画布、路径编排、缩放旋转转场及多媒体编辑,将传统逐页幻灯片转化为更具空间感的动态演示。

    Folder Colorizer 2 macOS版
    Folder Colorizer 2 macOS版

    Folder Colorizer 2 macOS版是一款直观的文件夹外观定制工具,可更换颜色,添加表情、贴纸及图片背景,并支持批量处理、智能推荐和恢复默认样式,帮助用户更快辨认工作、学习与生活资料。

    WINDOWS 更多
    Fuzor Windows版
    Fuzor Windows版

    Fuzor Windows版是一套面向建筑、工程与施工团队的BIM/VDC平台,可汇集多来源模型和进度数据,完成实时可视化、4D施工推演、场地物流规划、问题检查、成果演示及团队协同。

    Gety Windows版
    Gety Windows版

    Gety Windows版是一款本地AI文件搜索工具,可索引电脑中的文档和图片,通过全文搜索、语义检索与OCR快速定位内容,并提供原版式预览、筛选和AI工具连接功能。

    iMazing Windows版
    iMazing Windows版

    iMazing Windows版是一款面向iPhone、iPad和iPod用户的本地设备管理工具,可在电脑上完成多版本备份、照片与音乐传输、信息导出、应用数据管理以及新旧设备迁移。

    Mercalli Windows版
    Mercalli Windows版

    Mercalli是一款面向Windows用户的专业视频稳定与画面修复工具,可分析手持、运动相机、无人机和长焦素材中的抖动,校正滚动快门及CMOS果冻效应,并提供曝光、色彩、锐度和镜头画面优化功能。

    NiceLabel Windows版
    NiceLabel Windows版

    NiceLabel是面向Windows平台的商业条码标签设计与打印工具,可制作文字、图像、条码及变量数据标签,并支持数据库连接、批量打印、打印自动化和集中管理,适用于制造、仓储、物流及零售等场景。

    pdfFactory Windows版
    pdfFactory Windows版

    pdfFactory是一款面向Windows的PDF虚拟打印机,可从支持打印的应用程序创建PDF,在保存前完成即时预览、页面排序、旋转、删除及多文档合并,并支持字体嵌入、邮件发送等办公功能。

    Polarr Windows版
    Polarr Windows版

    Polarr Windows版是一款面向摄影爱好者与内容创作者的照片编辑工具,提供曝光和色彩调整、曲线、HSL、滤镜、局部蒙版、人像修饰、叠加效果及批量导出等功能,适合日常修图、社交媒体配图和较细致的影像后期处理。

    AIDA64 Windows版
    AIDA64 Windows版

    AIDA64是一款面向Windows电脑用户的系统信息、硬件诊断与基准测试工具,可识别处理器、主板、显卡、存储设备和系统组件,并实时监控温度、电压、功耗及风扇转速,适合装机验收、性能比较和稳定性排查。

    Portraiture Windows版
    Portraiture Windows版

    Portraiture Windows版是一款面向人像摄影后期的智能润饰插件,可在Photoshop、Lightroom Classic和Affinity中完成皮肤平滑、AI区域识别、肤色统一及补光处理,

    priPrinter 7 Windows版
    priPrinter 7 Windows版

    priPrinter 7 Windows版是一款虚拟打印机与打印预览工具,可接收其他程序的打印任务,在输出前调整页面顺序、边距与版式,并添加水印、页码或批注。专业版还支持文本修正、内容脱敏、打印历史和PDF发布。

    PSD Manager Windows版
    PSD Manager Windows版

    PSD Manager是适用于Windows版Autodesk 3ds Max的渲染后期插件,可把画面、渲染元素、对象及材质蒙版整理成分层PSD或PSB文件,便于在Photoshop、Affinity Photo和After Effects

    RayFire Windows版
    RayFire Windows版

    RayFire是运行于Windows版Autodesk 3ds Max中的破碎与刚体动力学插件,集成实时Voronoi切割、交互式拆除、爆炸、裂纹、缓存和体素等工具,适合影视特效、游戏动画及建筑坍塌镜头制作。