У меня есть четыре файла .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 из основного заголовка в заголовок плитки — но это тоже не помогло.
Вот как бы я это сделал. Просто начни это задом наперед. Давайте предположим, что ваше целевое изображение имеет размер 512×512, а каждая из 4-х плиток (вход J2K) имеет размер 256×256. В этом случае давайте создадим поддельный (но действительный) эквивалент файла 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
они полезны только для того, чтобы убедиться, что COC
а также QCC
производятся после COD
а также QCD
из основного заголовка.
Теперь, когда у вас есть действительный контейнер JP2 (формат), вам просто нужно заменить каждый отдельный фрагмент (действительный кодовый поток J2K) своим (их должно быть 4).
Еще одна важная вещь, чтобы проверить, что все кодовые потоки имеют SOT length
, Помните, что допустимо, чтобы длина SOT равнялась нулю (неопределенная длина) только для самой последней плитки.
Если вы хотите пойти дальше, вам необходимо убедиться, что:
QCD
а также COD
если ваше изображение имеет идентичные параметры (я предположил, что они несколько отличались)TLM
маркеры