Выполнение нескольких операций над изображением в памяти с помощью libjpeg - PullRequest
0 голосов
/ 28 сентября 2018

У меня есть приложение, в котором я хотел бы выполнить обмен плиток в формате JPEG без потерь, что привело бы к созданию файла, такого как этот: image with tiles swapped Для этого я смог сделатьСценарий Python для проверки концепции, который неоднократно вызывает исправленный jpegtran с поддержкой кадрирования и отбрасывания следующим образом:

# Export tiles
for i, swap in enumerate(swaps):
    if i > 0:
        continue
    commanda = [
        jtp,
        "-crop", "{}x{}+{}+{}".format(dividerWidth, dividerHeight, swap["sx"], swap["sy"]),
        "-outfile", "tmp/s{}s.jpg".format(i),
        "original.jpg"
    ]
    commandb = [
        jtp,
        "-crop", "{}x{}+{}+{}".format(dividerWidth, dividerHeight, swap["dx"], swap["dy"]),
        "-outfile", "tmp/s{}d.jpg".format(i),
        "original.jpg"
    ]
    print(list2cmdline(commanda))
    call(commanda)
    print(list2cmdline(commandb))
    call(commandb)


# Then drop them on the original
for i, swap in enumerate(swaps):
    command = [jtp]
    if i == len(swaps) - 1:
        command.append("-optimize")

    source = "mixed.jpg"
    if i == 0:
        source = "original.jpg"

    commanda = command.copy()
    commanda.extend([
        "-drop", "+{}+{}".format(swap["dx"], swap["dy"]),
        "tmp/s{}s.jpg".format(i),
        "-outfile", "mixed.jpg",
        source
    ])

    commandb = command.copy()
    commandb.extend([
        "-drop", "+{}+{}".format(swap["sx"], swap["sy"]),
        "tmp/s{}d.jpg".format(i),
        "-outfile", "mixed.jpg",
        "mixed.jpg"
    ])
    print(list2cmdline(commanda))
    call(commanda)
    print(list2cmdline(commandb))
    call(commandb)

Это, однако, очень неэффективно и медленно.Я начал пытаться сделать версию, вдохновленную исходным кодом jpegtrans (исправлено), но безрезультатно.Я не понимаю, как я беру обрезанное изображение (в jpeg_compress_struct) после выполнения (jtransform_execute_transformation) и затем сбрасываю его на изображение.Мне кажется, что я мог бы сделать это только с одной копией всего изображения в памяти, вырезать части и уронить их в другие места, но я понятия не имею, как это сделать.

...