Java实现图片与Base64互转及保存的完整指南
最近在做项目时遇到一个很常见的需求Java 后端接收图片的 Base64 字符串把它解码保存到服务器指定目录同时也要能把服务器上的图片转成 Base64 返回给前端。这个需求在接口对接、文件上传、图片展示场景里出现频率极高很多刚接触的同学会在这一步卡住一方面是不清楚 Base64 和图片文件之间到底是怎么转换的另一方面是路径处理和目录创建这类细节经常被忽略导致本地运行没问题、部署到服务器就各种报错。这篇文章我会把图片转 Base64、Base64 转图片并保存到路径目录的完整过程拆开讲清楚包括原理、Java 标准库实现、完整工具类封装以及我实际踩过的一些坑。无论你是刚工作不久的后端开发还是偶尔要写接口的全栈同学按这篇文章的步骤走基本能一次跑通。1. 先说清楚这个需求到底在解决什么问题1.1 Base64 与图片互转的真实业务场景很多人第一次接触 Base64 转图片是在对接第三方接口的时候。比如某个支付平台要求上传凭证图片对方接口文档里写的不是 multipart/form-data 文件上传而是一个 JSON 字段里面放的是图片的 Base64 字符串。这时候你就必须把图片文件读出来转成 Base64再塞到 JSON 里提交。反过来更常见。前端用 Canvas 把用户头像裁剪、压缩之后得到的是一个data:image/png;base64,iVBORw0KGgo...这样格式的字符串然后通过接口传给后端。后端要做的事情就是把这个 Base64 字符串解码成字节数组再写到服务器的某个目录下比如/data/upload/avatar/最后把文件访问路径存到数据库里。还有一种场景是图片展示。有些老系统为了减少 HTTP 请求会把小图标、小图片直接以 Base64 形式存在数据库里前端拿到字符串直接渲染。但这种做法只适合很小的图片几十 KB 以内还行图片一大就非常浪费流量也不利于缓存所以现在一般只作为兜底方案。1.2 为什么不用 MultipartFile 直接传文件有同学可能会问既然 Spring MVC 支持 MultipartFile 文件上传为什么还要折腾 Base64最核心的原因是接口协议限制。很多移动端 App 或小程序在特定场景下没法走 multipart 表单或者对接的第三方接口就是要求 JSON 传字符串你没有选择权。另外前端在某些情况下只能拿到图片的 Base64 数据比如 Canvas 处理后的图片、剪贴板粘贴的图片、微信头像临时链接转 Base64 等这时候后端就需要具备接收 Base64 的能力。还有一个比较实际的原因Base64 字符串本身是纯文本方便日志记录、方便调试也方便存在数据库或消息队列里做异步处理。如果走文件流你就得考虑临时文件的生命周期、跨服务传输的额外复杂度。不过也要注意Base64 会让原始数据膨胀约 33%。一张 1MB 的图片转成 Base64 大概是 1.37MB 的字符串接口传输、JSON 解析都会慢一些。所以我的经验是Base64 传图适合小图或特定协议场景大图尽量走对象存储用直传或分片上传。2. 原理拆解Base64 编码与 Java 里的标准实现2.1 Base64 编码的本质要写代码之前先把原理搞清楚不然遇到解码失败你会一脸懵。图片本身是二进制数据由一堆字节组成每个字节 8 位。Base64 做的事情很简单把每 3 个字节24 位拆成 4 组每组 6 位然后把这 4 个 6 位的值映射到 64 个可打印字符A-Z、a-z、0-9、、/上。如果原始字节数不是 3 的倍数末尾会补 0 或补。所以你会看到 Base64 字符串经常会以结尾这就是补位字符。Java 中图片转 Base64 的核心流程用Files.readAllBytes()或FileInputStream把图片文件读成byte[]。用Base64.getEncoder().encodeToString(bytes)把字节数组编码成字符串。字符串可以直接返回给前端或者存库、拼接接口请求。Base64 转图片的核心流程正好反过来拿到 Base64 字符串。用Base64.getDecoder().decode(str)解码成byte[]。把byte[]写入目标路径比如用Files.write()或FileOutputStream。整个过程中最核心的就是java.util.Base64这个类它从 Java 8 开始就是标准库了不需要引入任何第三方依赖。如果你用的还是 Java 7 或更低版本那只能用sun.misc.BASE64Decoder或者引入 Apache Commons Codec但这类老写法已经不推荐了能升 JDK 就升 JDK。注意sun.misc.BASE64Encoder是 JDK 内部类不同版本的 JDK 行为不稳定还可能在模块化系统下无法访问千万别再用它写生产代码。2.2 Java 标准库里的 Base64 工具java.util.Base64提供了几个静态方法分别对应不同的编码场景Base64.getEncoder()/Base64.getDecoder()标准 Base64字符集是A-Za-z0-9/末尾可能带。Base64.getUrlEncoder()/Base64.getUrlDecoder()URL 安全的 Base64把换成-把/换成_适合放在 URL 参数里。Base64.getMimeEncoder()/Base64.getMimeDecoder()MIME 格式每 76 个字符会插入一个换行主要用来处理邮件、MIME 协议相关的场景。图片转换一般用第一组也就是标准的 getEncoder/getDecoder。前端给你的data:image/png;base64,xxx字符串拿到后要做两件事先去掉逗号前面的前缀再解码后面的主体部分。这部分代码我下面会专门给出。3. 完整代码实现图片转 Base643.1 最简版本读取文件并编码先上一个最直接的版本把本地图片转成 Base64 字符串import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Base64; public class ImageToBase64Demo { public static void main(String[] args) throws IOException { // 图片路径根据实际情况修改 Path imagePath Paths.get(/data/upload/demo.png); // 读取图片为字节数组 byte[] imageBytes Files.readAllBytes(imagePath); // 编码为 Base64 字符串 String base64Str Base64.getEncoder().encodeToString(imageBytes); System.out.println(Base64 字符串长度: base64Str.length()); System.out.println(前 100 个字符: base64Str.substring(0, Math.min(100, base64Str.length()))); } }这段代码的关键点就两个Files.readAllBytes()一次性把整个图片文件读进内存Base64.getEncoder().encodeToString()把字节数组变成字符串。如果你的图片很大比如几十 MB一次性readAllBytes()会比较吃内存但这属于极端场景。日常图片上传一般有限制比如 5MB 以内用这个方式完全没问题。大文件处理方案我后面也会提到。3.2 在 Web 接口中返回 Base64 字符串实际项目里我们经常是在 Controller 里把图片转成 Base64 返回给前端。比如用户上传头像之后前端需要立即预览这时候后端可以直接返回头像的 Base64import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Base64; import java.util.HashMap; import java.util.Map; RestController RequestMapping(/api/image) public class ImageController { GetMapping(/toBase64) public MapString, Object imageToBase64(RequestParam(filePath) String filePath) throws IOException { Path path Paths.get(filePath); byte[] imageBytes Files.readAllBytes(path); // MIME 类型可以根据扩展名推断这里直接写死示例 String base64Str Base64.getEncoder().encodeToString(imageBytes); String dataUrl data:image/png;base64, base64Str; MapString, Object result new HashMap(); result.put(base64, base64Str); result.put(dataUrl, dataUrl); return result; } }这里我把data:image/png;base64,前缀也拼上了。前端拿到之后可以直接赋值给img标签的src属性不需要再做任何处理。提示如果你要返回完整的 data URL注意 MIME 类型要和图片实际格式匹配。PNG 就是image/pngJPG 就是image/jpeg。前端虽然对错误的 MIME 有一定容忍度但规范上还是应该写对。4. 完整代码实现Base64 转图片并保存到目录4.1 最简版本解码字符串并写文件接下来是最核心的部分把 Base64 字符串解码成图片并保存到路径目录下。import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Base64; public class Base64ToImageDemo { public static void main(String[] args) throws IOException { // 假设这个是前端传过来的 Base64 字符串实际开发中来自接口参数 String base64Str iVBORw0KGgoAAAANSUhEUg...; // 解码 byte[] imageBytes Base64.getDecoder().decode(base64Str); // 保存到路径 Path outputPath Paths.get(/data/upload/from_base64.png); Files.write(outputPath, imageBytes); System.out.println(图片已保存到: outputPath.toAbsolutePath()); } }如果你拿到的字符串是带前缀的data:image/png;base64,xxx直接丢给Base64.getDecoder().decode()会抛出IllegalArgumentException因为data:image/png;base64,这段字符根本不是合法的 Base64。解决办法是先截取逗号后面的部分下面专门讲。4.2 自动创建目录与文件命名策略生产环境里目标目录不一定提前存在尤其是新部署的服务器。你如果直接Files.write()会报NoSuchFileException因为它不会自动创建父目录。所以必须先手动创建目录import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Base64; import java.util.UUID; public class Base64ToImageWithDir { public static String saveBase64Image(String base64Str, String uploadDir) throws IOException { // 1. 去除 data URL 前缀如果有 String pureBase64 base64Str; int commaIndex base64Str.indexOf(,); if (commaIndex 0) { pureBase64 base64Str.substring(commaIndex 1); } // 2. 解码 byte[] imageBytes Base64.getDecoder().decode(pureBase64); // 3. 创建目录 Path dirPath Paths.get(uploadDir); if (!Files.exists(dirPath)) { Files.createDirectories(dirPath); } // 4. 生成文件名 String fileName UUID.randomUUID().toString().replace(-, ) .png; Path filePath dirPath.resolve(fileName); // 5. 写入文件 Files.write(filePath, imageBytes); return filePath.toString(); } }这里有几个细节比较容易忽略Files.createDirectories()会递归创建所有不存在的父目录Files.createDirectory()只能创建一级用错了会报NoSuchFileException。文件名用 UUID 生成可以避免不同用户上传同名文件互相覆盖。.replace(-, )是为了去掉 UUID 里的横线让文件名短一点纯看个人习惯。扩展名要尽量根据图片的真实格式来定而不要一律写死.png。判断方式看下面。4.3 处理带 data URL 前缀的 Base64 字符串前端传的 Base64 图片最常见的形式就是data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...。处理这种字符串前面代码里用indexOf(,)截取是可行的但有些同学会不小心处理成indexOf(base64,)之后取错位置所以这里我给一个更稳健的写法public static String extractPureBase64(String dataUrl) { if (dataUrl null || dataUrl.isEmpty()) { throw new IllegalArgumentException(Base64 字符串不能为空); } // 如果包含逗号取逗号后的部分否则认为整体就是纯 Base64 int commaIndex dataUrl.indexOf(,); if (commaIndex 0) { return dataUrl.substring(commaIndex 1); } return dataUrl; }还有一个小点需要注意有些接口返回的 Base64 字符串里可能包含换行符尤其是在 MIME 编码下每 76 个字符就是一个换行。服务端接到的字符串如果有\n或\r\n直接解码会失败。稳妥做法是在解码前把空白字符去掉String cleaned pureBase64.replaceAll(\\s, ); byte[] imageBytes Base64.getDecoder().decode(cleaned);replaceAll(\\s, )会去掉空格、换行、制表符等所有空白字符。这招在处理日志里复制出来的 Base64、或者从文件里读到的 Base64 时特别有用。5. 实战封装一个通用工具类5.1 工具类完整代码把前面这些处理逻辑整合到一起封装成一个工具类后面所有项目都可以直接复用import java.io.IOException; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Base64; import java.util.UUID; public class Base64ImageUtil { private Base64ImageUtil() { } /** * 图片文件转 Base64 字符串 * * param imagePath 图片绝对路径或相对路径 * return Base64 字符串不含 data URL 前缀 */ public static String imageToBase64(String imagePath) throws IOException { Path path Paths.get(imagePath); byte[] imageBytes Files.readAllBytes(path); return Base64.getEncoder().encodeToString(imageBytes); } /** * Base64 字符串转图片并保存到指定目录 * * param base64Str Base64 字符串可带 data URL 前缀 * param uploadDir 保存目录 * param extension 文件扩展名如 png、jpg不带点 * return 保存后的完整文件路径 */ public static String base64ToImage(String base64Str, String uploadDir, String extension) throws IOException { if (base64Str null || base64Str.isEmpty()) { throw new IllegalArgumentException(Base64 字符串不能为空); } // 去除 data URL 前缀和空白字符 String pureBase64 extractPureBase64(base64Str).replaceAll(\\s, ); // 解码 byte[] imageBytes Base64.getDecoder().decode(pureBase64); // 创建目录 Path dirPath Paths.get(uploadDir); if (!Files.exists(dirPath)) { Files.createDirectories(dirPath); } // 生成文件名 String fileName UUID.randomUUID().toString().replace(-, ) . extension; Path filePath dirPath.resolve(fileName); // 写入 Files.write(filePath, imageBytes); return filePath.toString(); } private static String extractPureBase64(String dataUrl) { int commaIndex dataUrl.indexOf(,); if (commaIndex 0) { return dataUrl.substring(commaIndex 1); } return dataUrl; } }这个工具类里我加了一个extension参数这样调用方可以根据图片实际格式传png、jpg、webp等扩展名。你也可以在前端传参时带上图片类型更准确。5.2 使用示例与输出结果写一个 main 方法演示从 Base64 转图片再转回 Base64 的完整闭环import java.io.IOException; public class Demo { public static void main(String[] args) throws IOException { // 1. 模拟一个带前缀的 Base64 字符串实际开发中从前端接收 String dataUrl data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAA...; // 2. 转图片并保存到目录 String savedPath Base64ImageUtil.base64ToImage(dataUrl, /data/upload/avatar, png); System.out.println(保存路径: savedPath); // 3. 再把保存的图片转回 Base64 String base64 Base64ImageUtil.imageToBase64(savedPath); System.out.println(转回 Base64 长度: base64.length()); } }正常情况下你会看到先输出保存路径然后再输出转回 Base64 的长度。到这里图片转换和保存的最核心流程就跑通了。注意Files.write()默认是覆盖写。如果同路径文件已存在会被直接覆盖。因为文件名用了 UUID所以基本不会冲突但如果你的生成规则是固定文件名比如用户 ID 固定后缀就要考虑覆盖策略是否符合业务需求。6. 常见问题与排查实录6.1 解码失败字符串不是合法的 Base64这是遇到最多的问题。常见的报错是java.lang.IllegalArgumentException: Input byte[] should at least have 2 bytes for base64 bytes或者java.lang.IllegalArgumentException: Illegal base64 character 2d这种报错背后的原因通常是字符串带上了data:image/png;base64,前缀但你没去掉。字符串里含有换行符直接解码抛异常。字符串被前端截断或者 URL 编码过比如变成了空格。字符串本身不是 Base64比如你传了普通文本。排查方式很简单打印字符串的前 100 个字符看看开头是什么有没有data:有没有%等 URL 编码痕迹。如果是 URL 编码导致的先用URLDecoder.decode()处理。import java.net.URLDecoder; import java.nio.charset.StandardCharsets; String decoded URLDecoder.decode(encodedStr, StandardCharsets.UTF_8);但一般情况下只要做两件事就够了先截掉前缀再replaceAll(\\s, )。6.2 写文件时报权限异常或路径不存在服务器上经常遇到的报错是java.nio.file.AccessDeniedException: /data/upload/avatar/xxx.png这通常是目录权限问题而不是代码问题。项目使用的运行用户没有目标目录的写权限。排查步骤确认目录是否存在ls -ld /data/upload/avatar。确认运行 Java 进程的用户是什么。尝试手动创建目录并赋权mkdir -p /data/upload/avatar chown -R appuser:appuser /data/upload/avatar。另外还有一个细节为了应对目录不存在的情况代码里一定要用Files.createDirectories()而不是直接Files.write()。我之前见过同事在本地测试没问题部署到生产环境就报NoSuchFileException就是因为生产环境的目录还没建出来。6.3 大图片导致内存占用过高Files.readAllBytes()和Base64.getDecoder().decode()都会把整个图片加载到内存。如果你处理的是 50MB 以上的大图内存压力会比较大尤其是并发量上来之后很容易触发OutOfMemoryError。解决办法有几个方向接口层限制 Base64 字符串长度比如超过 10MB 直接拒绝。使用流式处理Base64.getDecoder().wrap(inputStream)配合Files.newOutputStream()一边解码一边写文件不一次性加载到内存。对大图场景改用 multipart 文件上传或对象存储直传避免 Base64 传输。流式处理的示例import java.io.InputStream; import java.io.OutputStream; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.Base64; public class StreamDecodeDemo { public static void main(String[] args) throws Exception { String base64Str iVBORw0KGgoAAAANSUhEUgAA...; Path outputPath Paths.get(/data/upload/stream_demo.png); try (InputStream inputStream Base64.getDecoder().wrap( new java.io.ByteArrayInputStream(base64Str.getBytes(java.nio.charset.StandardCharsets.UTF_8))); OutputStream outputStream Files.newOutputStream(outputPath)) { byte[] buffer new byte[8192]; int len; while ((len inputStream.read(buffer)) ! -1) { outputStream.write(buffer, 0, len); } } System.out.println(流式解码完成); } }注意这里base64Str.getBytes()还是会先把字符串变成字节数组内存占用没有彻底解决但对于网络传输场景你可以直接从请求流读取再配合Base64.getDecoder().wrap()做真正的流式解码。实际项目里我建议先用接口限流和大小限制兜底流式处理做进一步优化。6.4 文件名乱码与中文路径问题如果你用原始文件名保存比如前端传来的头像.png在 Linux 服务器上可能出现文件名乱码。这是因为不同环境的字符编码不一致。我比较推荐的做法是不在服务器端信任前端传入的文件名统一用 UUID 或时间戳生成新文件名。如果你确实想保留原始文件名那就必须确保保存时用 UTF-8 处理String fileName new String(originalFileName.getBytes(StandardCharsets.UTF_8), StandardCharsets.UTF_8);另外如果图片的 Base64 字符串是在 JSON 里传输的要注意 JSON 解析框架是否会把字符串中的/转义。一般不会影响解码因为/本身是合法 Base64 字符但你要心里有数遇到奇怪问题时可以先打印字符串内容确认。7. 一些扩展思路从能用变成好用Base64 转图片这个功能做出来容易做好则需要考虑更多细节。我项目中实际踩过几次坑之后沉淀了几个比较好用的习惯分享给你。第一个习惯是把图片格式判断放在前端做。前端在转 Base64 的时候要把图片类型一起传过来比如imageTypeimage/png后端根据这个 MIME 类型决定文件扩展名。不要试图用魔数嗅探自动判断图片格式虽然可以做但代码会复杂不少而且容易出现误判。第二个习惯是保存图片后返回给前端的不只是文件路径而是可以直接访问的 URL。如果你把图片保存在静态资源目录可以通过配置映射把本地路径暴露成 URL。比如 Spring 项目中Configuration public class WebConfig implements WebMvcConfigurer { Override public void addResourceHandlers(ResourceHandlerRegistry registry) { // 把本地的 /data/upload/ 映射到 /upload/** registry.addResourceHandler(/upload/**) .addResourceLocations(file:/data/upload/); } }这样你保存图片后返回/upload/avatar/xxx.png前端就能直接拼上域名访问图片了。这一步在实际项目中很关键因为很多情况下后端的职责不只是保存文件还要让文件能被访问到。第三个习惯是加一层内容校验。Base64 解码之前可以先判断一下字符串长度是否合理比如base64Str.length() % 4 0Base64 标准要求长度是 4 的倍数含补位。不满足的字符串直接拒绝省得解码时抛异常再处理。当然去掉空白字符之后再做这个判断才准确。第四个习惯是考虑磁盘空间。如果图片量很大比如用户头像、聊天图片这种高频场景一定要在写入前检查磁盘剩余空间。Java 里可以用FileStore获取磁盘空间import java.nio.file.FileStore; import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; Path dir Paths.get(/data/upload); FileStore store Files.getFileStore(dir); long usableSpace store.getUsableSpace(); long totalSpace store.getTotalSpace(); double usablePercent (double) usableSpace / totalSpace * 100; if (usablePercent 10) { // 磁盘剩余空间不足 10%可以拒绝写入并告警 }这个检查放在大规模图片存储场景下非常有用能提前避免磁盘写满导致的其他服务故障。第五个习惯是Base64 字符串不要直接存数据库。我在一些老项目里见过把图片 Base64 字符串存进 MySQL 的一个字段几 MB数据库查询、备份、同步都会变得很慢。正确做法是存文件路径图片文件放在磁盘或对象存储上。最后再分享一个小技巧如果调试时遇到解码问题可以先写一段临时代码把 Base64 字符串的前 50 个字符和后 50 个字符打印出来。很多时候你只要看开头就能确认问题所在——是带了data:前缀还是被 URL 编码了或者是换行造成的。这种排查方式比盯着报错信息猜原因高效得多。如果你已经跑通了本文的示例代码下一步可以试着把这个工具类接入你的实际项目替换掉之前散落在 Controller 里的一堆临时逻辑。以后遇到类似需求直接复用就行。

相关新闻

STM32寄存器操作实战:从点灯到定时器与串口,彻底搞懂底层开发

STM32寄存器操作实战:从点灯到定时器与串口,彻底搞懂底层开发

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 1:04:48 阅读更多 →
优先队列PriorityQueue实战:原理、应用场景与避坑指南

优先队列PriorityQueue实战:原理、应用场景与避坑指南

大概很多年前我第一次做任务调度模块时,把所有待处理任务都塞进了一个普通队列,先进先出,看起来毫无问题。直到系统里突然混进来一个必须在几秒内给出结果的紧急请求,而它前面还堵着几百个耗时任务,那一刻我才真正意识…

2026/10/13 1:04:48 阅读更多 →
Agent Skills 操作指南:从 SKILL.md 到 MCP 自定义进阶

Agent Skills 操作指南:从 SKILL.md 到 MCP 自定义进阶

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 1:04:48 阅读更多 →

最新新闻

NCCL 参数访问 API 完全指南:Handle 绑定与 Key 直查两种运行时参数读取方式

NCCL 参数访问 API 完全指南:Handle 绑定与 Key 直查两种运行时参数读取方式

高性能计算通信深度学习分布式训练 【免费下载链接】nccl Optimized primitives for collective multi-GPU communication 项目地址: https://gitcode.com/gh_mirrors/nc/nccl 点击查看 免费下载 NCCL(NVIDIA Collective Communications Library&#x…

2026/10/13 1:52:15 阅读更多 →
Vorssaint:免费开源的 macOS 菜单栏工具箱,77 个小工具收进一个图标

Vorssaint:免费开源的 macOS 菜单栏工具箱,77 个小工具收进一个图标

Vorssaint:免费开源的 macOS 菜单栏工具箱,77 个小工具收进一个图标 【免费下载链接】vorssaint-utils Free and open-source macOS menu bar toolkit. 项目地址: https://gitcode.com/GitHub_Trending/vo/vorssaint-utils 逐应用音量、系统监控、剪贴板历史,这些功能在…

2026/10/13 1:52:15 阅读更多 →
Terminus (Olares) router call translate 实战指南:单句、检测、语言对清单与整段对话翻译

Terminus (Olares) router call translate 实战指南:单句、检测、语言对清单与整段对话翻译

云原生后端运维 【免费下载链接】Terminus Open-Source Personal Cloud OS for Always-On Agents 项目地址: https://gitcode.com/gh_mirrors/terminus2/Terminus 点击查看 免费下载 本文围绕 Olares(Terminus 开源个人云操作系统)中 olares…

2026/10/13 1:52:15 阅读更多 →
go-systemd:在 Docker Engine 中以 Go 语言深度对接 systemd 的实战指南

go-systemd:在 Docker Engine 中以 Go 语言深度对接 systemd 的实战指南

容器运行时云原生 【免费下载链接】docker-ce :warning: This repository is deprecated and will be archived (Docker CE itself is NOT deprecated) see the https://github.com/docker/docker-ce/blob/master/README.md :warning: 项目地址: https://gitcode.co…

2026/10/13 1:52:15 阅读更多 →
第 13 章 选哪个材质:Standard vs PBR vs OpenPBR

第 13 章 选哪个材质:Standard vs PBR vs OpenPBR

本章实测环境:Babylon.js 9.30.0、Vite 8.3.4、TypeScript 5.9.3、Windows 11 Chrome(WebGL2 后端)。 本章代码:src/chapters/ch13-material-comparison.ts,运行后打开 http://localhost:18000/?ch13。 图中所有&quo…

2026/10/13 1:52:15 阅读更多 →
sherpa-onnx 完整解析:5 分钟跑通本地离线语音识别与语音合成

sherpa-onnx 完整解析:5 分钟跑通本地离线语音识别与语音合成

sherpa-onnx 完整解析:5 分钟跑通本地离线语音识别与语音合成 【免费下载链接】sherpa-onnx Speech-to-text, text-to-speech, speaker diarization, speech enhancement, source separation, and VAD using next-gen Kaldi with onnxruntime without Internet conn…

2026/10/13 1:51:15 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 21:05:09 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 14:48:49 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →