5

最终目标是将烟花 png 文件中的页面导出到单个图像。所以我有几个问题:

  1. 你知道什么——库、应用程序——已经这样做了吗?
  2. 你有关于格式的任何信息吗?我假设他们将信息存储在专门的块中。我只是希望这些块的有效载荷的格式不那么难以弄清楚。

我还没有挖掘任何烟花文件。我没有找到有关格式的信息,所以这是下一步,但我想有人可能知道一点并节省我一些时间:)。

我希望(并且可能不是这种情况)是每个页面都以 PNG 格式存储在单独的 IDAT 块中。但是,由于矢量功能,这不太可能。也许他们将 svg 格式存储在块中?

任何帮助或讨论表示赞赏。我计划在接下来的几天内深入研究这个问题。

编辑:这里有几件事:下面链接的超级用户帖子表明文件是 APNG。烟花文件不是 APNG。APNG 包含动画块:acTL、fcTL、fdAT。Fireworks 除了 IDAT 块外,还有 prVW、mkBF、mkTS、mkBS、mkBT 块,但没有 APNG 块。

这里有一篇关于烟花 PNG 的非常可靠的帖子: http://newsgroup.xnview.com/viewtopic.php?f=35&t=20592# p86243

所以我想我需要知道这些块做什么,以及如何解析它们。

4

2 回答 2

2

我自己对 Adob​​e Fireworks 文件中的私有块类型进行的一些挖掘如下(假设 Python 切片符号):

prVW(“缩略图预览?”)

Data format:
- bytes[0:4]   - Chunk length
- bytes[4:8]   - Chunk type
- bytes[8:10]  - zlib file magic 0x789c
- bytes[10:-8] - zlib data
- bytes[-8:-4] - zlib checksum
- bytes[-4:]   - Chunk checksum

After decompressing, the first 4-bytes are the value "0xcafebeef",
likely another file magic byte value for whatever format the data is
in.


MKBF

Data format:
- bytes[0:4]   - Chunk length
- bytes[4:8]   - Chunk type
- bytes[8:12]  - 0xfadecafe (file magic?)
- bytes[12:16] - big-endian length value?
- bytes[16:80] - 64-byte NULL-padded data field
- bytes[80:84] - Chunk checksum


MKBS

Data format:
- bytes[0:4]   - Chunk length
- bytes[4:8]   - Chunk type
- bytes[8:10]  - zlib file magic 0x789c
- bytes[10:-8] - zlib data
- bytes[-8:-4] - zlib checksum
- bytes[-4:]   - Chunk checksum


MKBT

Data format:
- bytes[0:4]   - Chunk length
- bytes[4:8]   - Chunk type
- bytes[8:12]  - 0xfacecafe (file magic?)
- bytes[12:16] - Unknown big-endian value.  Increments for
                 each mkBT chunk present, and appears to only
                 consume the lower 24-bits.
- bytes[16:84] - 68-byte NULL-padded data field
- bytes[84:86] - zlib file magic 0x789c
- bytes[86:-8] - zlib data
- bytes[-8:-4] - zlib checksum
- bytes[-4:]   - Chunk checksum

This chunk may contain a split/spanned zlib stream, as the decompressed
data is cut at 64kb per mkBT chunk and does not appear to carry a zlib
checksum value.  Decompressing each zlib stream and then concatenating them
all together does not appear to be wrong.


MKTS

Data format:
- bytes[0:4]   - Chunk length
- bytes[4:8]   - Chunk type
- bytes[8:10]  - zlib file magic 0x789c
- bytes[10:-8] - zlib data
- bytes[-8:-4] - zlib checksum
- bytes[-4:]   - Chunk checksum
于 2018-08-04T06:56:49.807 回答
1

有趣的问题。

如果您正在尝试编写一个获取 Fireworks PNG(APNG) 并保存页面的实用程序,请不要有多大帮助,但这里有:

您可以使用 Fireworks 中的 Export 菜单:File > Export > Pages to Files

您也可以使用Save as选项并选择Photoshop PSD。此选项将页面保留为 Photoshop 图层面板中的文件夹/组,但它会栅格化矢量形状。不过,如果您想解析 PSD而不是 APNG(访问图像、页面),它可能会很方便。

我整理了一个小脚本(主要使用文档),它将您当前打开的 Fireworks PNG 的 PSD 保存到您选择的文件夹中:

var doc = fw.getDocumentDOM();
var loc = fw.browseForFolderURL("select a folder to save pages");

var prevWarn = fw.getPref("PsdExport_Warn100"); // bool 
fw.setPref("PsdExport_Warn100", false);    // don't warn. 

var kObjToLayer = 1; 
var kFlatten = 2; 
var prevLayers = fw.getPref("PsdExport_Layers"); 
fw.setPref("PsdExport_Layers", kObjToLayer);    // flatten layers or not. 

var kEffectEditable = 1; 
var kEffectRender = 2; 
var prevEffects = fw.getPref("PsdExport_Effects"); 
fw.setPref("PsdExport_Effects", kEffectEditable); 

var kTextEditable = 1; 
var kTextRender = 2; 
var prevText = fw.getPref("PsdExport_Text"); 
fw.setPref("PsdExport_Text", kTextRender); 

if(loc) fw.exportPSD(doc, loc+"/yourPages.psd"); 

// Put the prefs back. 
fw.setPref("PsdExport_Warn100", prevWarn); 
fw.setPref("PsdExport_Layers", prevLayers); 
fw.setPref("PsdExport_Effects", prevEffects); 
fw.setPref("PsdExport_Text", prevText);

如果您将其保存为 .jsf 文件,并在 Fireworks 中打开了一个文档,您应该只需双击 .jsf 文件即可。

另外,注意到有一个可用的导出 PSD 扩展,它比我这里的小脚本有更多的选项。

如果您需要矢量形状,可以使用文件导出 > FXG 和图像并选择格式下方的所有页面。FXG 是 xml 格式,有规格

高温高压

于 2010-11-22T11:17:22.517 回答