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 のソース コードに触発されたバージョン (パッチを適用したバージョン) を作成しようと試み始めましたが、役に立ちませんでした。(jtransform_execute_transformation) を実行して画像にドロップした後、トリミングした画像を (jpeg_compress_struct で) 取得する方法がわかりません。メモリ内の画像全体のコピーを1つだけ使用してこれを実行し、一部を切り取って他の場所にドロップできるように思えますが、どうすればよいかわかりません。