我正在实现解码photoshop(PSD)文件。它们具有大部分记录的格式,但不是全部。在较新版本的photoshop中,您可以具有视频层。视频层数据存储在“ PxSD”标签中(内容未记录)。我设法使用以下代码对某些元数据进行了反向工程:
case "PxSD": {
// Raw data for 3D or video layers.
var length = stream.readUint64();
var layer_id = stream.readUint32(); // id of video layer
var unknown1 = stream.readUint32(); // = 2
var unknown2 = stream.readUint32(); // = 2
var size = stream.readUint64(); // remaining size
var numFrames = stream.readUint32();
for (var nframe = 0; nframe < numFrames; ++nframe)
{
var size2 = stream.readUint64();
var absFrame = stream.readUint32();
var layerTop = stream.readUint32();
var layerLeft = stream.readUint32();
// TODO: mode, 1 for grayscale image, 3 = RGB image
// They are always same?
var mode = stream.readUint32();
var mode2 = stream.readUint32();
// TODO: numChannels
// 4 if painting on a frame from blank video layer
// 6 if painting on top of an imported RGB video
var channels = 4;
for (var ch = 0; ch < channels; ++ch)
{
var depth = stream.readUint32(); // 8
var top = stream.readInt32(); // layer dimensions
var left = stream.readInt32();
var bottom = stream.readInt32();
var right = stream.readInt32();
var unknown3 = stream.readUint32();
let sz = stream.readUint32();
var dt = new Uint8Array(sz);
stream.readUint8Array(dt);
console.log(dt);
}
}
break;
}
一些实际压缩数据内容的例子
宽度:1,高度:1-完全是黑色(0)通道
[0、3、72、137、250、15、16、96、0、1、0、1、0、0、0、0](长度= 16)
宽度:1,高度:1-完全白色(255)的通道
[0,3,72,137,98,0,8,48,0,0,1,0,1,0,0,0](长度= 16)
宽度:96,高度:8-完全黑色(0)的通道
[0、3、72、137、250、207、64、91、240、127、212、252、81、243、7、177, 249,0,1,6,0,118,67,7,249,0,0,0]
宽度:96,高度:8-全白色(255)通道
[0,3,72,137,98,96,24,5,163,96,228,2,128,0,3,0,3,0,0, 1]
宽度:96,高度:7-完全黑色(0)的通道
[0、3、72、137、250、207、64、91、240、127、212、252、81、243、41、0, 0,1,6,0,120,182,6,250]
有人对使用哪种压缩有任何想法吗? (肯定是无损的)(他们使用宏块,某种无损的JPEG吗?仅仅是zlib吗?)有人指出我正确的方向吗?它是什么样子的?想法?
谢谢
答案 0 :(得分:0)
好吧,似乎数据的前2个字节是压缩
0=uncompressed
1=RLE
2=ZLIB
3=ZLIB with prediction
尚未经过全面测试