<p>在C中实现的PIL部分位于<code>PIL._imaging</code>模块中,在您<code>from PIL import Image</code>之后也可以作为<code>Image.core</code>使用。
当前版本的枕头给每个<code>PIL.Image.Image</code>实例一个名为<code>im</code>的成员,它是<code>ImagingCore</code>的实例,一个在<code>PIL._imaging</code>中定义的类。
您可以用<code>help(oldimage.im)</code>列出它的方法,但是这些方法本身在Python中没有文档。</p>
<p><code>ImagingCore</code>对象的<code>convert</code>方法在<a href="https://github.com/python-pillow/Pillow/blob/master/_imaging.c" rel="noreferrer">^{<cd11>}</a>中实现。
它接受一到三个参数并创建一个新的<code>ImagingCore</code>对象(在<code>_imaging.c</code>内称为<code>Imaging_Type</code>)。</p>
<ul>
<li><code>mode</code>(必需):模式字符串(例如<code>"P"</code>)</li>
<li><code>dither</code>(可选,默认为0):PIL传递0或1</li>
<li><code>paletteimage</code>(可选):带有调色板的<code>ImagingCore</code></li>
</ul>
<p>我面临的问题是<code>dist-packages/PIL/Image.py</code>中的<code>quantize()</code>将<code>dither</code>参数强制为1。
所以我取出了<code>quantize()</code>方法的一个副本并更改了它。
这在枕头的未来版本中可能不起作用,但如果不起作用,它们很可能实现<code>quantize()</code>中的注释承诺的“以后版本中的扩展量化器接口”。</p>
<pre><code>#!/usr/bin/env python3
from PIL import Image
def quantizetopalette(silf, palette, dither=False):
"""Convert an RGB or L mode image to use a given P image's palette."""
silf.load()
# use palette from reference image
palette.load()
if palette.mode != "P":
raise ValueError("bad mode for palette image")
if silf.mode != "RGB" and silf.mode != "L":
raise ValueError(
"only RGB or L mode images can be quantized to a palette"
)
im = silf.im.convert("P", 1 if dither else 0, palette.im)
# the 0 above means turn OFF dithering
# Later versions of Pillow (4.x) rename _makeself to _new
try:
return silf._new(im)
except AttributeError:
return silf._makeself(im)
palettedata = [0, 0, 0, 102, 102, 102, 176, 176, 176, 255, 255, 255]
palimage = Image.new('P', (16, 16))
palimage.putpalette(palettedata * 64)
oldimage = Image.open("School_scrollable1.png")
newimage = quantizetopalette(oldimage, palimage, dither=False)
newimage.show()
</code></pre>