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);
关键修正点说明
- 跳过文本格式的干扰:不再使用带空格、换行的
data字符串,直接从原始颜色数组处理,避免写入多余的空白字符。 - 十六进制转二进制字节:用
parseInt(hex, 16)把两位十六进制字符串转换成0-255的十进制数值,再用String.fromCharCode()把数值转换成对应的二进制字节——这才是ACT文件需要的原始二进制数据。 - 高效写入:先把所有二进制字节拼接成一个字符串,再一次性写入,比逐字符循环写入更高效,也避免循环中的潜在错误。
这样生成的文件大小就是48字节,和Sublime保存的结果一致,后续操作就不会有问题了。
内容的提问来源于stack exchange,提问作者Ghoul Fool
相关产品推荐
相关产品推荐

