장고 모델에 저장되어있는 "오버레이"설정에 대한 미리보기를 생성하려고하는데 나중에 다른 모델에 적용됩니다. 내가하지 많은 경험 파이썬으로 파일 조작이 ... = (완드로 생성 된 이미지를 django에 저장 ImageField
다음내 코드입니다 :
import io
from django.conf import settings
from django.db import models
from wand.image import Image
from PIL.ImageFile import ImageFile, Parser, Image as PilImage
class Overlay(models.Model):
RELATIVE_POSITIONS = (...)
SIZE_MODES = (...)
name = models.CharField(max_length=50)
source = models.FileField(upload_to='overlays/%Y/%m/%d')
sample = models.ImageField(upload_to='overlay_samples/%Y/%m/%d', blank=True)
px = models.SmallIntegerField(default=0)
py = models.SmallIntegerField(default=0)
position = models.CharField(max_length=2, choices=RELATIVE_POSITIONS)
width = models.SmallIntegerField(default=0)
height = models.SmallIntegerField(default=0)
size_mode = models.CharField(max_length=1, choices=SIZE_MODES, default='B')
last_edit = models.DateTimeField(auto_now=True)
def generate_sample(self):
"""
Generates the sample image and saves it in the "sample" field model
:return: void
"""
base_pic = Image(filename=os.path.join(settings.BASE_DIR, 'girl.jpg'))
overlay_pic = Image(file=self.source)
result_pic = io.BytesIO()
pil_parser = Parser()
if self.width or self.height:
resize_args = {}
if self.width:
resize_args['width'] = self.width
if self.height:
resize_args['height'] = self.height
overlay_pic.resize(**resize_args)
base_pic.composite(overlay_pic, self.px, self.py)
base_pic.save(file=result_pic)
result_pic.seek(0)
while True:
s = result_pic.read(1024)
if not s:
break
pil_parser.feed(s)
pil_result_pic = pil_parser.close()
self.sample.save(self.name, pil_result_pic, False)
def save(self, force_insert=False, force_update=False, using=None, update_fields=None):
self.generate_sample()
super(Overlay, self).save(force_insert, force_update, using, update_fields)
하지만 난 여기 읽어 내 장고 디버그 데이터에 일부 AttributeError 받고 있어요 :
/usr/local/lib/python2.7/dist-packages/django/core/files/utils.py in <lambda>
"""
encoding = property(lambda self: self.file.encoding)
fileno = property(lambda self: self.file.fileno)
flush = property(lambda self: self.file.flush)
isatty = property(lambda self: self.file.isatty)
newlines = property(lambda self: self.file.newlines)
read = property(lambda self: self.file.read)
readinto = property(lambda self: self.file.readinto)
readline = property(lambda self: self.file.readline)
readlines = property(lambda self: self.file.readlines)
seek = property(lambda self: self.file.seek)
softspace = property(lambda self: self.file.softspace)
tell = property(lambda self: self.file.tell)
▼ 현지 바르 변수 값
self <File: None>
/usr/local/lib/python2.7/dist-packages/PIL/Image.py in __getattr__
# numpy array interface support
new = {}
shape, typestr = _conv_type_shape(self)
new['shape'] = shape
new['typestr'] = typestr
new['data'] = self.tobytes()
return new
raise AttributeError(name)
def __getstate__(self):
return [
self.info,
self.mode,
self.size,
▼ 로컬 변수 값 변수 값
self <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=1080x1618 at 0x7F1429291248>
name 'read'
무엇이 잘못 되었습니까?
는 "django.core.files이 파일을 가져에서"와 "django.core.files.images이 ImageFile을 가져에서"많은 다른 방법 아무것도 시도가 보인다 우연히 있다. 사전 – netomo
에서 천 감사도 함께 시도 : pil_result_pic = pil_parser.close() django_file = 파일 (오픈 (pil_result_pic)) self.sample.save (self.name, django_file, 거짓) 이제 점점 다음 오류 : 유니 코드로 강제 변환 : 필요한 문자열 또는 버퍼가 필요합니다. 인스턴스가 발견되었습니다. 모르겠지만 어쨌든 나는 @ @ alexey-kuleshevich 가까이 있다고 생각한다. – netomo
유니 코드로의 coersing은 바이너리 모드로 열리지 않았기 때문에 일어난다 고 생각한다. 그러나 나는 100 % 확실하지 않다. 어떤 경우 든 제안 된 새로운 솔루션이 귀하에게 적합한 지 여부를 알려주십시오. –