2

我有四个已知大小相同的 .j2k 文件(无损),我想将它们组合成一个更大的 .j2k 文件。当然,现在简单而有效的方法是将它们解压缩为位图并将较大的位图压缩为 .j2k 文件 - 但这是性能开销。有没有更简单的方法?如果是这样,您可以用伪代码突出显示它吗?

更新

根据@malat 的建议,我尝试了以下操作(请参阅我的 github 存储库以获取完整的源代码和图像示例)

// for the simplicity I'm using same image to make 4 tiles 2x2
jpeg.header.Xsiz *= 2;
jpeg.header.Ysiz *= 2;
vector<j2k_tile_part> tiles = jpeg.tiles;

BOOST_FOREACH(j2k_tile_part& part, jpeg.tiles)
{
    part.Isot = 2;
}

for (int i = 0; i < 3; i++)
{
    BOOST_FOREACH(const j2k_tile_part& part, tiles)
    {
        j2k_tile_part clone(part);
        switch(i)
        {
        case 0:
            clone.Isot = 3;
            break;
        case 1:
            clone.Isot = 0;
            break;
        case 2:
            clone.Isot = 1;
            break;
        }
        jpeg.tiles.push_back(clone);
    }
}

jpeg.save_file(output_file);

哪个有效(就具有正确尺寸和填充图像数据的图像而言)。只有第一块瓷砖看起来还可以,但其他瓷砖就搞砸了。我虽然瓷砖是单独编码的 - 我错了吗?我还尝试将 COD 和 QCC 标记从主标题复制到平铺标题 - 但这也没有帮助。

组合图像

4

1 回答 1

0

这是我将如何做到的。只需向后启动即可。假设您的目标图像是 512x512,并且您的 4 个图块(J2K 输入)中的每一个都是 256x256。在这种情况下,让我们创建一个假的(但有效的)JP2 文件等效项:

$ wget http://www.ece.rice.edu/~wakin/images/lena512color.tiff
$ kdu_compress -i lena512color.tif -o out.jp2 Stiles="{256,256}"  Clevels:T0C1=0  Cuse_sop:T3=yes  Cycc:T2=no

不要太担心Clevels:T0C1=0 Cuse_sop:T3=yes Cycc:T2=no,它们仅用于确保COCQCC是在主标题COD之后生成的。QCD

现在您有了一个有效的 JP2 容器(格式),您只需用您的(应该有 4 个)替换每个单独的图块(有效的 J2K 码流)。

另一个重要的事情是检查所有码流是否有正确的SOT length. 请记住,仅对于最后一个图块,SOT 长度为零(未定义长度)是合法的。

如果您想走得更远,您需要确保:

  • 尝试重复使用QCDCOD如果您的图像具有相同的参数(我假设它们有些不同)
  • 添加TLM标记
于 2015-05-13T13:24:39.697 回答