Я реализую декодирование файлов Photoshop (PSD).У них есть формат, в основном документированный, но не все.В новых версиях фотошопа вы можете иметь видео слои.А данные видеослоя хранятся в теге «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, 01, 6, 0,120, 182, 6, 250]
У кого-нибудь есть мысли о том, какой тип сжатия используется?(это, безусловно, без потерь) (они используют макроблоки, какой-то JPEG без потерь? Это просто zlib?) Кто-нибудь указывает мне правильное направление?как это выглядит?Идеи?
Спасибо