既然你知道像素值是 0-4095,我找不到比这更快的方法:
new_image= image.point(lambda value: value<<4 | value>>8)
根据文档,无论图像大小如何,lambda 函数最多会被调用 4096 次。
编辑:由于给定点的函数必须argument * scale + offset
是图像中的形式I
,那么这是使用该函数的最佳point
方法:
new_image= image.point(lambda argument: argument*16)
最大输出像素值为 65520。
第二次拍摄:
您自己的解决方案的修改版本,itertools
用于提高效率:
import itertools as it # for brevity
import operator
def scale_12to16(image):
new_image= image.copy()
new_image.putdata(
it.imap(operator.or_,
it.imap(operator.lshift, image.getdata(), it.repeat(4)),
it.imap(operator.rshift, image.getdata(), it.repeat(8))
)
)
return new_image
这避免了point
函数参数的限制。