javascript - 你如何使用 npm pngjs web 版本解析方法来获取 png 文件并将文件写入磁盘
问题描述
我在 stackoverflow 上阅读的问题并没有帮助我解决我的问题。
这是所有客户端代码,没有nodejs。
我有使用 Fetch api 在 response.body 中返回 png 的代码。我可以使用 File System Access Api 成功将此文件写入磁盘。在不通过 pngjs 处理 png 的情况下,图像被正确保存。
尽管 pngjs 说它接受一个可读流并且 response.body 应该是一个可读流,但 pngjs 会抛出一个错误。我的猜测是网络上的可读流与nodejs格式不同。但是,我可以将 fetch 中的数据作为 ArrayBuffer 返回,而 pngjs 将毫无问题地接受这一点。
我的问题是从 pngjs parse 方法返回的 png 已损坏,即使我实际上没有对 parsed 方法中的图像做任何事情。
这是一些代码。
//Fecth png 到 ArrayBuffer
const response = await fetch(url);
let arrayBuffer = await response.arrayBuffer()
//用pngjs解析arrayBuffer
processImage(arrayBuffer)
async function processImage(arrayBuffer) {
let dst = new PNG({})
return new Promise((res, rej) => {
// res(arrayBuffer)
dst.parse(arrayBuffer, function (error, data) {
res(data.pack())
})
})
}
}
}
//将文件写入磁盘
writable.write({type: "write", data: data.data})
await writable.close();
在解析方法期间,我没有对数据做任何事情,只是为了测试。
从上面的代码中,如果我只返回 arrayBufferres(arrayBuffer)
文件是正确的。但是,我是否将它传递给 pngjs 解析方法,即使我没有修改它原来已损坏的文件。
当我不解析文件时,它返回正确大小的 ArrayBuffer 并写出大小为 595kb 的文件,arrayBuffer 大小为 608325
当我解析文件时,即使我没有修改它。生成的文件大小为 1024kb,ArrayBuffer 大小为 1048576。
从两个进程返回的 ArrayBuffer 都是 uint8Array 类型。
预期结果:是不是因为我没有在 pngjs 解析方法中更改文件,所以返回的 ArrayBuffer 应该是相同的大小并且文件不应该被损坏。
更新: 我尝试了不同的 png 编码器/解码器库,结果相同。
import UPNG from '@pdf-lib/upng';
const response = await fetch(url);
let arrayBuffer = await response.arrayBuffer()
let img = UPNG.decode(arrayBuffer); // put ArrayBuffer of the PNG file into UPNG.decode
let rgba = UPNG.toRGBA8(img)[0]; // UPNG.toRGBA8 returns array of frames, size: width * height * 4 bytes.
解决方案
推荐阅读
- python - ImportError:DLL 加载失败:找不到指定的模块。执行脚本失败
- powershell - VsCode 挂起/冻结状态栏中的“正在启动 powershell”
- api - (NoSuchMethodError:在 null 上调用了 getter 'length'。接收方:null 尝试调用:length)
- java - 从另一个提供循环依赖的模块打开活动
- c# - 将 JSON 转换为具有泛型类型的列表
- tableau-api - 从命令行运行流程时出现 TabPy Server 配置错误
- css - TypeScript 编码的菜单和网格无法正确显示
- ios - 为什么 Application Loader 找不到我的图标(错误代码:ERROR ITMS-90023)?
- web-crawler - 从种子 URL 到所有深度的所有子发现 URL 发出自定义元数据
- swift - 如何绑定 ObservableObject?