Python 透明PNG don';t转换后保持透明度(Django&x2B;PIL)

Python 透明PNG don';t转换后保持透明度(Django&x2B;PIL),python,django,python-imaging-library,Python,Django,Python Imaging Library,我正在使用和在Web服务器上在模板中动态创建缩略图 PIL安装时支持PNG,但由于某些原因,转换在图像的透明部分创建了一些非常奇怪的工件 我在Github上使用了这个要点来安装所需的依赖项: 以下是生成图像的模板代码(我不认为这是问题所在,但向您展示一下也无妨): {%thumbnail project.image“148x108”crop=“center”as im%} {%endthumbnail%} 下面是一个发生了什么的例子。非常感谢您的帮助 之前 之后 生成的图像似乎是JPEG。J

我正在使用和在Web服务器上在模板中动态创建缩略图

PIL安装时支持PNG,但由于某些原因,转换在图像的透明部分创建了一些非常奇怪的工件

我在Github上使用了这个要点来安装所需的依赖项:

以下是生成图像的模板代码(我不认为这是问题所在,但向您展示一下也无妨):

{%thumbnail project.image“148x108”crop=“center”as im%}
{%endthumbnail%}
下面是一个发生了什么的例子。非常感谢您的帮助

之前

之后

生成的图像似乎是JPEG。JPEG格式不支持透明度。尝试将缩略图模板更改为:

{% thumbnail project.image "148x108" crop="center" format="PNG" as im %}

我建议您研究一下sorl的PIL后端是如何处理扩展的。我想它会创建一些辅助图像来应用附加效果,然后告诉PIL将原始图像缩放到该图像上。您需要确保目的地使用的是
RGBA
模式来支持透明度,并且它从alpha设置为零开始(而不是纯白色或沥青黑色或类似)。如果您的图像使用的是索引调色板,则可能无法转换为
RGBA
。在索引模式下,PNG将透明颜色索引存储在其元数据中,但创建缩略图的过程将由于抗锯齿而改变像素,因此您无法在以下位置保留索引透明度:

source = Image.open('dead-parrot.png')
source.convert('RGBA')
dest = source.resize((100, 100), resample=Image.ANTIALIAS)
dest.save('ex-parrot.png')
要么:

  • 添加
    format='PNG'

  • 向设置中添加
    THUMBNAIL\u PRESERVE\u FORMAT=True
  • 或使用此处所述的自定义引擎:

在您的设置中:

THUMBNAIL_ENGINE = 'path.to.Engine'
您现在可以使用该选项:

{% thumbnail my_file "100x100" format="JPEG" background="#333333" as thumb %}
   <img src="{{ thumb.url }}" />
{% endthumbnail %}
{%thumbnail my_file“100x100”format=“JPEG”background=“#333333”as thumb%}
{%endthumbnail%}

您使用的是哪种sorl缩略图后端?thumbnail\u PRESERVE\u FORMAT=True似乎是最简单的方法,因为FORMAT='PNG'对我来说很有用。。。有一次,我还记得禁用浏览器缓存,这样我以前失败的上传尝试就不会一直出现。
THUMBNAIL_ENGINE = 'path.to.Engine'
{% thumbnail my_file "100x100" format="JPEG" background="#333333" as thumb %}
   <img src="{{ thumb.url }}" />
{% endthumbnail %}