Выполнение нескольких операций над изображением в памяти с помощью libjpeg
У меня есть приложение, в котором я хотел бы выполнить обмен плиток в формате JPEG без потерь, что приведет к созданию файла, такого как этот: Для этого мне удалось создать проверенный на 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) и затем сбрасываю его на изображение. Мне кажется, что я мог бы сделать это только с одной копией всего изображения в памяти, вырезать части и уронить их в другие места, но я понятия не имею, как это сделать.