【问题标题】:flask-images generating image error for some imagesflask-images 为某些图像生成图像错误
【发布时间】:2021-04-11 17:57:13
【问题描述】:

我已经建立了一个烧瓶网站,它已经工作了一年多,但是我刚刚遇到了一个在使用烧瓶图像生成调整大小的图像时没有正确调整大小的图像。静态图像加载正确,所以我只能假设烧瓶图像调整大小时出错。我找不到任何方法来查看确切的错误,所以我有点陷入故障排除。任何帮助将不胜感激。

错误: 图片 [image] 包含错误,无法显示。

图片损坏示例:

调整大小的网址: https://www.eskimotv.net/imgsizer/img/cover-images/zack-snyder-s-justice-league-still-sucks-2021-cover-image.jpg?h=466&m=crop&v=YHMxhA&w=994&s=b%27vYAlpffxM8wbfIREZG62hM5XzIw%27

运行静态资源: https://www.eskimotv.net/static/img/cover-images/zack-snyder-s-justice-league-still-sucks-2021-cover-image.jpg

它适用于其他图像的示例:

调整大小的网址: https://www.eskimotv.net/imgsizer/img/cover-images/hellboy-2019-cover-image.jpg?h=466&m=crop&v=Xtmyyw&w=994&s=b%27JYX9u5-jNkVgzcqvZlA-kObl7QU%27

静态资源: https://www.eskimotv.net/static/img/cover-images/hellboy-2019-cover-image.jpg

调整代码大小:

<img class="img-responsive webfeedsFeaturedVisual" src="{{ resized_img_src(article.image,width=994,height=466,mode='crop') }}" alt="{{ article.title }} Cover">

编辑:

通过在本地运行服务器并查看错误日志,我能够在 flask-images 尝试生成调整大小图像的缓存版本时识别出以下错误:

web_1  | 172.18.0.1 - - [13/Apr/2021 02:06:54] "GET /imgsizer/img/cover-images/short-cover-image.jpg?h=466&m=crop&v=YHT8vQ&w=994&s=b%27U8Rbw9xy3J63t0mPW3NHN
aNfSCo%27 HTTP/1.1" 500 -
web_1  | Traceback (most recent call last):
web_1  |   File "/home/eskimotv/venv/lib/python3.8/site-packages/PIL/JpegImagePlugin.py", line 633, in _save
web_1  |     rawmode = RAWMODE[im.mode]
web_1  | KeyError: 'RGBA'
web_1  |
web_1  | The above exception was the direct cause of the following exception:
web_1  |
web_1  | Traceback (most recent call last):
web_1  |   File "/home/eskimotv/venv/lib/python3.8/site-packages/flask/app.py", line 2464, in __call__
web_1  |     return self.wsgi_app(environ, start_response)
web_1  |   File "/home/eskimotv/venv/lib/python3.8/site-packages/flask/app.py", line 2450, in wsgi_app
web_1  |     response = self.handle_exception(e)
web_1  |   File "/home/eskimotv/venv/lib/python3.8/site-packages/flask/app.py", line 1867, in handle_exception
web_1  |     reraise(exc_type, exc_value, tb)
web_1  |   File "/home/eskimotv/venv/lib/python3.8/site-packages/flask/_compat.py", line 39, in reraise
web_1  |     raise value
web_1  |   File "/home/eskimotv/venv/lib/python3.8/site-packages/flask/app.py", line 2447, in wsgi_app
web_1  |     response = self.full_dispatch_request()
web_1  |   File "/home/eskimotv/venv/lib/python3.8/site-packages/flask/app.py", line 1952, in full_dispatch_request
web_1  |     rv = self.handle_user_exception(e)
web_1  |   File "/home/eskimotv/venv/lib/python3.8/site-packages/flask/app.py", line 1821, in handle_user_exception
web_1  |     reraise(exc_type, exc_value, tb)
web_1  |   File "/home/eskimotv/venv/lib/python3.8/site-packages/flask/_compat.py", line 39, in reraise
web_1  |     raise value
web_1  |   File "/home/eskimotv/venv/lib/python3.8/site-packages/flask/app.py", line 1950, in full_dispatch_request
web_1  |     rv = self.dispatch_request()
web_1  |   File "/home/eskimotv/venv/lib/python3.8/site-packages/flask/app.py", line 1936, in dispatch_request
web_1  |     return self.view_functions[rule.endpoint](**req.view_args)
web_1  |   File "/home/eskimotv/venv/lib/python3.8/site-packages/flask_images/core.py", line 428, in handle_request
web_1  |     image.save(cache_file, format, quality=quality)
web_1  |   File "/home/eskimotv/venv/lib/python3.8/site-packages/PIL/Image.py", line 2172, in save
web_1  |     save_handler(self, fp, filename)
web_1  |   File "/home/eskimotv/venv/lib/python3.8/site-packages/PIL/JpegImagePlugin.py", line 635, in _save
web_1  |     raise OSError(f"cannot write mode {im.mode} as JPEG") from e
web_1  | OSError: cannot write mode RGBA as JPEG

【问题讨论】:

    标签: python python-3.x flask


    【解决方案1】:

    问题1:关于查找和查看错误:通过本地运行flask服务器并查看日志,我能够找到并查看pillow产生的错误。我会将完整的错误添加到问题中。

    问题 2:关于图像的问题。生成错误的图像在保存到静态目录时具有某种 alpha 层,即使它被保存为 jpg。虽然我不了解用于生成缓存调整大小图像的 flask-images 方法,但我确实可以访问将外部图像保存到我的服务器的方法。所以,在保存静态内容的时候,我只是简单的在本地保存图片的方法中添加了这一行,以便在保存之前转换图片:

    img = img.convert("RGB")
    

    这是基于 Python Pillow 的这个问题:

    https://github.com/python-pillow/Pillow/issues/2609

    这样,静态源通过丢弃透明层完全兼容烧瓶图像的调整大小图像方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-27
      • 1970-01-01
      • 2018-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多