You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Extendscript在Photoshop中写入二进制文件时文件大小异常问题咨询

问题根源与解决方案

你遇到的问题核心很明确:你现在是把十六进制的文本字符直接写入了文件,而不是把十六进制值转换成对应的二进制字节。这就是为什么文件大小差了2.5倍——你的代码把每个字符(包括空格、换行)都当成一个字节存储,而正确的ACT文件需要把每两位十六进制转换成一个二进制字节。

为什么当前代码会生成大文件?

你拼接的data字符串里,每个十六进制字符(比如'1'、'a')、空格、换行都是单独的ASCII字节,算下来总共有119个字符,所以文件就是119字节。但ACT格式的16色文件只需要48字节:每个颜色是RGB三个字节,16个颜色就是16×3=48字节,这才是Sublime保存后正确的大小。

修正后的代码

直接从你的原始颜色数组处理,跳过那些多余的空格和换行,把每个6位十六进制颜色转换成对应的RGB二进制字节:

// 原始十六进制颜色数组
var myArray = [ "1a2b3c", "4d5e6f", "a10000", "700000", "d10101", "dc0202", "c30202", "de0b0b", "d91515", "f06060", "fbbaba", "ffeeee", "303030", "000000", "000000", "000000" ]
var afile = "D:\\temp\\bin.act"
var f = new File(afile);
f.encoding = "BINARY";
f.open ("w");

var binaryContent = "";
for (var i = 0; i < myArray.length; i++) {
    var hexColor = myArray[i];
    // 拆分RR、GG、BB部分,转成十进制数值
    var red = parseInt(hexColor.substring(0, 2), 16);
    var green = parseInt(hexColor.substring(2, 4), 16);
    var blue = parseInt(hexColor.substring(4, 6), 16);
    // 把数值转换成对应二进制字节
    binaryContent += String.fromCharCode(red, green, blue);
}

// 一次性写入所有二进制内容
f.write(binaryContent);
f.close();
alert("Written " + afile);

关键修正点说明

  1. 跳过文本格式的干扰:不再使用带空格、换行的data字符串,直接从原始颜色数组处理,避免写入多余的空白字符。
  2. 十六进制转二进制字节:用parseInt(hex, 16)把两位十六进制字符串转换成0-255的十进制数值,再用String.fromCharCode()把数值转换成对应的二进制字节——这才是ACT文件需要的原始二进制数据。
  3. 高效写入:先把所有二进制字节拼接成一个字符串,再一次性写入,比逐字符循环写入更高效,也避免循环中的潜在错误。

这样生成的文件大小就是48字节,和Sublime保存的结果一致,后续操作就不会有问题了。

内容的提问来源于stack exchange,提问作者Ghoul Fool

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 17:12:28