Django ImageField не может обрабатывать изображения - PullRequest
0 голосов
/ 29 августа 2018

Я создаю проект django, в котором я хранил изображение (изображение) в базе данных, используя ImageField как ...

original_pic = models.ImageField()

Кроме того, я хочу сохранить изображение, которое будет содержать такое же изображение (изображение), как original_pic с водяным знаком, в другом ImageField как ..

display_pic = models.ImageField(null=True, blank=True)

Короче говоря, я просто хочу применить алгоритм к original_pic и сохранить результат в watermark_pic с использованием моделей django

Алгоритм (логика) для нанесения водяного знака на изображение выглядит следующим образом ...

def watermark_image_with_text(filename):
   text = 'PicMesh'
   color = 'blue'
   fontfamily = 'arial.ttf'
   image = Image.open(filename).convert('RGBA')
   imageWatermark = Image.new('RGBA', image.size, (255, 255, 255, 0))
   draw = ImageDraw.Draw(imageWatermark)
   width, height = image.size
   font = ImageFont.truetype(fontfamily, int(height / 20))
   textWidth, textHeight = draw.textsize(text, font)
   x = width / 5
   y = height / 6
   draw.text((x, y), text, color, font)
   my_image = Image.alpha_composite(image, imageWatermark)
   my_image.convert('RGB').save('D:\Github\PicMesh\media\water_'+
   filename.name + '.png')
   return 'D:\Github\PicMesh\media\water_'+filename.name + '.png'

My Models.py содержит следующую модель Photo, которая перезаписывает метод сохранения для сохранения значения в display_pic.

class Photo(models.Model):
format_of_tags = (
    ('PNG', 'PNG'),
    ('JPG', 'JPG'),
    ('JPEG', 'JPEG'),
    ('Exif', 'Exif'),
    ('TIF', 'TIF'),
    ('GIF', 'GIF'),
    ('WEBP', 'WEBP'),
    ('SVG', 'SVG'),
)
title = models.CharField(max_length=150)
format = models.CharField(max_length=20, choices=format_of_tags, blank=False)
tags = models.CharField(max_length=250)
original_pic = models.ImageField()
display_pic = models.ImageField(null=True, blank=True)
description = models.CharField(max_length=1000)
photographer = models.ForeignKey('Photographer', on_delete=models.CASCADE)
category = models.ForeignKey('Categories', on_delete=models.CASCADE, default=0)

# Overwrites save method and set value of display_pic by default
def save(self, *args, **kwargs):
    if not self.pk:
        rotate_img_name = watermark_image_with_text(self.original_pic)
    self.display_pic = rotate_img_name
    super().save(*args, **kwargs)

Проблема с кодом заключается в том, что он прекрасно обрабатывает все форматы изображений, например, для JPG, JPG, JPEG и т. Д., Но не может обрабатывать изображения в формате TIF.

Я получил OSError при вызове метода save() Ошибка отслеживания выглядит следующим образом ...

`Internal Server Error: /admin/home/photo/add/
Traceback (most recent call last):
  File "C:\Users\abx\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django-2.1b1-py3.6.egg\django\core\handlers\exception.py", line 34, in inner
    response = get_response(request)
  File "C:\Users\abx\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django-2.1b1-py3.6.egg\django\core\handlers\base.py", line 126, in _get_response
    response = self.process_exception_by_middleware(e, request)
  File "C:\Users\abx\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django-2.1b1-py3.6.egg\django\core\handlers\base.py", line 124, in _get_response
    response = wrapped_callback(request, *callback_args, **callback_kwargs)
  File "C:\Users\abx\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django-2.1b1-py3.6.egg\django\contrib\admin\options.py", line 607, in wrapper
    return self.admin_site.admin_view(view)(*args, **kwargs)
  File "C:\Users\abx\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django-2.1b1-py3.6.egg\django\utils\decorators.py", line 140, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "C:\Users\abx\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django-2.1b1-py3.6.egg\django\views\decorators\cache.py", line 44, in _wrapped_view_func
    response = view_func(request, *args, **kwargs)
  File "C:\Users\abx\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django-2.1b1-py3.6.egg\django\contrib\admin\sites.py", line 223, in inner
    return view(request, *args, **kwargs)
  File "C:\Users\abx\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django-2.1b1-py3.6.egg\django\contrib\admin\options.py", line 1647, in add_view
    return self.changeform_view(request, None, form_url, extra_context)
  File "C:\Users\abx\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django-2.1b1-py3.6.egg\django\utils\decorators.py", line 43, in _wrapper
    return bound_method(*args, **kwargs)
  File "C:\Users\abx\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django-2.1b1-py3.6.egg\django\utils\decorators.py", line 140, in _wrapped_view
    response = view_func(request, *args, **kwargs)
  File "C:\Users\abx\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django-2.1b1-py3.6.egg\django\contrib\admin\options.py", line 1536, in changeform_view
    return self._changeform_view(request, object_id, form_url, extra_context)
  File "C:\Users\abx\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django-2.1b1-py3.6.egg\django\contrib\admin\options.py", line 1575, in _changeform_view
    self.save_model(request, new_object, form, not add)
  File "C:\Users\abx\AppData\Local\Programs\Python\Python36-32\lib\site-packages\django-2.1b1-py3.6.egg\django\contrib\admin\options.py", line 1094, in save_model
    obj.save()
  File "D:\Github\PicMesh\home\models.py", line 53, in save
    rotate_img_name = watermark_image_with_text(self.original_pic)
  File "D:\Github\PicMesh\home\models.py", line 16, in watermark_image_with_text
    image = Image.open(filename).convert('RGBA')
  File "C:\Users\abx\AppData\Local\Programs\Python\Python36-32\lib\site-packages\PIL\Image.py", line 892, in convert
    self.load()
  File "C:\Users\abx\AppData\Local\Programs\Python\Python36-32\lib\site-packages\PIL\TiffImagePlugin.py", line 1061, in load
    return self._load_libtiff()
  File "C:\Users\abx\AppData\Local\Programs\Python\Python36-32\lib\site-packages\PIL\TiffImagePlugin.py", line 1153, in _load_libtiff
    raise IOError(err)
OSError: -2
[29/Aug/2018 10:15:37] "POST /admin/home/photo/add/ HTTP/1.1" 500 132413`
...