开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

12
返回列表 发新帖
楼主: 大大张
收起左侧

[已解决] 保存图片用什么代码稳定

 关闭 [复制链接]
结帖率:100% (39/39)
发表于 前天 18:19 | 显示全部楼层   福建省泉州市
建议加数组,开个单线程下载
回复

使用道具 举报

结帖率:57% (12/21)

签到天数: 2 天

发表于 前天 22:21 | 显示全部楼层   浙江省湖州市
在易语言中保存图片时出现软件自动关闭,通常是因为**路径错误、文件名含非法字符、资源未释放**或**异常未处理**导致的。以下是经过优化的稳定保存方案,解决了这些问题:### 稳定保存图片的代码实现```易语言.版本 2.支持库 spec.支持库 eAPI.子程序 保存图片_稳定版, 逻辑型.参数 保存路径, 文本型  // 完整保存路径(含文件名).参数 图片数据, 字节集  // 要保存的图片字节集.局部变量 文件句柄, 整数型.局部变量 写入长度, 整数型.局部变量 结果, 逻辑型    // 检查图片数据是否有效    如果 (取字节集长度 (图片数据) = 0)        调试输出 ("保存失败:图片数据为空")        返回 (假)    结束        // 打开文件(创建或覆盖)    文件句柄 = 打开文件 (保存路径, #文件读写, #CREATE_ALWAYS)    如果 (文件句柄 = 0)        调试输出 ("保存失败:无法打开文件,路径=" + 保存路径)        返回 (假)    结束        // 分块写入(大图片更稳定)    写入长度 = 写出文件 (文件句柄, 图片数据, 取字节集长度 (图片数据))    如果 (写入长度 = 取字节集长度 (图片数据))        结果 = 真        调试输出 ("保存成功:" + 保存路径)    否则        结果 = 假        调试输出 ("保存失败:写入长度不匹配,路径=" + 保存路径 + ",预期=" + 到文本 (取字节集长度 (图片数据)) + ",实际=" + 到文本 (写入长度))    结束        // 关闭文件(必须执行,否则文件占用导致崩溃)    关闭文件 (文件句柄)        返回 (结果).子程序尾.子程序 过滤非法文件名, 文本型.参数 原始文本, 文本型.局部变量 非法字符, 文本型.局部变量 i, 整数型    // 定义Windows不允许的文件名字符    非法字符 = "/\:*?""<>|"        // 替换所有非法字符为下划线    循环 (i = 1 到 取文本长度 (非法字符), i + 1)        原始文本 = 子文本替换 (原始文本, 取文本中间 (非法字符, i, 1), "_", , , 真)    循环结束        返回 (原始文本).子程序尾.子程序 保存图片_主流程, 逻辑型.参数 id, 文本型.参数 标题_局, 文本型.参数 图片数据, 字节集.局部变量 保存目录, 文本型.局部变量 文件名, 文本型.局部变量 完整路径, 文本型    // 1. 确保保存目录存在    保存目录 = 取运行目录 () + "\正则匹配\"    如果 (目录是否存在 (保存目录) = 假)        如果 (创建目录 (保存目录) = 假)            调试输出 ("保存失败:无法创建目录" + 保存目录)            返回 (假)        结束    结束        // 2. 过滤文件名中的非法字符(关键!避免因特殊字符导致崩溃)    文件名 = 过滤非法文件名 (id + " " + 标题_局) + ".jpg"        // 3. 组合完整路径    完整路径 = 保存目录 + 文件名        // 4. 调用稳定保存函数    返回 (保存图片_稳定版 (完整路径, 图片数据)).子程序尾```### 调用示例```易语言.版本 2.子程序 _按钮_保存图片_被单击.局部变量 图片数据, 字节集    // 从图片框获取图片数据(先转为字节集,避免直接引用图片框资源)    图片数据 = 图片框1.图片        // 调用稳定保存函数    如果 (保存图片_主流程 (id, 标题_局, 图片数据))        调试输出 ("第" + 到文本 (计数) + "张保存成功")    否则        调试输出 ("第" + 到文本 (计数) + "张保存失败")    结束        // 释放图片数据(减少内存占用)    图片数据 = { }```### 解决崩溃的核心优化点1. **确保目录存在**     保存前先检查`\正则匹配\`文件夹是否存在,不存在则创建(`创建目录`函数),避免因路径无效导致的写入失败。2. **过滤非法文件名**     文件名中不能包含`/、\、:、*、?、"、<、>、|`等字符,通过`过滤非法文件名`子程序将这些字符替换为下划线,避免写入时的系统级错误。3. **分块写入与资源释放**     使用`打开文件`+`写出文件`代替直接`写到文件`,支持大图片分块写入,且明确关闭文件句柄(`关闭文件`),避免文件句柄泄漏。4. **错误处理与日志**     每次保存都输出调试信息,记录成功/失败状态,方便定位问题(如磁盘满、权限不足等)。5. **减少内存占用**     保存后将图片字节集清空(`图片数据 = { }`),释放内存,避免多次保存后内存溢出。### 额外建议- 如果保存的是网络图片,建议先将图片下载为字节集再保存,避免直接引用图片框资源导致的锁定问题。- 对于大量图片( hundreds 级别),可以每保存10-20张图片后,调用`整理内存 ()`释放系统内存。- 检查保存目录所在磁盘是否有足够空间,以及是否有写入权限(尤其是C盘或受保护目录)。通过以上优化,保存图片的稳定性会大幅提升,基本可以避免“保存几十张后自动关闭”的问题。


  
子程序名返回值类型公开备 注
保存图片_稳定版逻辑型 
参数名类 型参考可空数组备 注
保存路径文本型  // 完整保存路径(含文件名)
图片数据字节集  // 要保存的图片字节集
变量名类 型静态数组备 注
文件句柄整数型 
写入长度整数型 
结果逻辑型 
// 检查图片数据是否有效
如果 (取字节集长度 (图片数据) = 0)
调试输出 ("保存失败:图片数据为空")
返回 ()
结束

// 打开文件(创建或覆盖)
文件句柄 = 打开文件 (保存路径, #文件读写, #CREATE_ALWAYS )
如果 (文件句柄 = 0)
调试输出 ("保存失败:无法打开文件,路径=" + 保存路径)
返回 ()
结束

// 分块写入(大图片更稳定)
写入长度 = 写出文件 (文件句柄, 图片数据, 取字节集长度 (图片数据))
如果 (写入长度 = 取字节集长度 (图片数据))
结果 = 真
调试输出 ("保存成功:" + 保存路径)
否则
结果 = 假
调试输出 ("保存失败:写入长度不匹配,路径=" + 保存路径 + ",预期=" + 到文本 (取字节集长度 (图片数据)) + ",实际=" + 到文本 (写入长度))
结束

// 关闭文件(必须执行,否则文件占用导致崩溃)
关闭文件 (文件句柄)

返回 (结果)
.子程序尾
子程序名返回值类型公开备 注
过滤非法文件名文本型 
参数名类 型参考可空数组备 注
原始文本文本型
变量名类 型静态数组备 注
非法字符文本型 
i整数型 
// 定义Windows不允许的文件名字符
非法字符 = "/\:*?""<>|"

// 替换所有非法字符为下划线
循环 (i = 1 到 取文本长度 (非法字符), i + 1)
原始文本 = 子文本替换 (原始文本, 取文本中间 (非法字符, i, 1), "_", , , )
循环结束

返回 (原始文本)
.子程序尾
子程序名返回值类型公开备 注
保存图片_主流程逻辑型 
参数名类 型参考可空数组备 注
id文本型
标题_局文本型
图片数据字节集
变量名类 型静态数组备 注
保存目录文本型 
文件名文本型 
完整路径文本型 
// 1. 确保保存目录存在
保存目录 = 取运行目录 () + "\正则匹配\"
如果 (目录是否存在 (保存目录))
如果 (创建目录 (保存目录))
调试输出 ("保存失败:无法创建目录" + 保存目录)
返回 ()
结束
结束

// 2. 过滤文件名中的非法字符(关键!避免因特殊字符导致崩溃)
文件名 = 过滤非法文件名 (id + " " + 标题_局) + ".jpg"

// 3. 组合完整路径
完整路径 = 保存目录 + 文件名

// 4. 调用稳定保存函数
返回 (保存图片_稳定版 (完整路径, 图片数据))
.子程序尾


i支持库列表   支持库注释   
spec特殊功能支持库
eAPI应用接口支持库

  
子程序名返回值类型公开备 注
_按钮_保存图片_被单击  
变量名类 型静态数组备 注
图片数据字节集 
// 从图片框获取图片数据(先转为字节集,避免直接引用图片框资源)
图片数据 = 图片框1.图片

// 调用稳定保存函数
如果 (保存图片_主流程 (id, 标题_局, 图片数据))
调试输出 ("第" + 到文本 (计数) + "张保存成功")
否则
调试输出 ("第" + 到文本 (计数) + "张保存失败")
结束

// 释放图片数据(减少内存占用)
图片数据 = { }

回复

使用道具 举报

签到天数: 6 天

发表于 前天 23:29 | 显示全部楼层   广东省惠州市
还是的看具体情况.. 这个代码本身没啥问题. 我曾经用这种代码存了几十个G的图片
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报QQ: 793400750,邮箱:wp@125.la
网站简介:精易论坛成立于2009年,是一个程序设计学习交流技术论坛,隶属于揭阳市揭东区精易科技有限公司所有。
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表