我有一个应用程序,我想在该应用程序中执行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格式)拍摄,然后将其拖放到图像上。我似乎可以只用内存中的整个图像的一个副本来完成此操作,然后裁剪出部分并将其放置在其他位置,但是我不知道该怎么做。