Python 将通过PIL创建的图像保存到django模型
我已成功创建并旋转了一个图像,该图像已通过电子邮件上传到我服务器上的一个目录,使用以下代码:Python 将通过PIL创建的图像保存到django模型,python,django,django-models,python-imaging-library,Python,Django,Django Models,Python Imaging Library,我已成功创建并旋转了一个图像,该图像已通过电子邮件上传到我服务器上的一个目录,使用以下代码: image = ContentFile(b64decode(part.get_payload())) im = Image.open(image) tempfile = im.rotate(90) tempfile.save("/srv/www/mysite.com/public_html/media/images/rotate.jpg", "JPEG")
image = ContentFile(b64decode(part.get_payload()))
im = Image.open(image)
tempfile = im.rotate(90)
tempfile.save("/srv/www/mysite.com/public_html/media/images/rotate.jpg", "JPEG")
img = Photo(user=user)
img.img.save('rotate.jpg', tempfile)
img.save()
image = ContentFile(b64decode(part.get_payload()))
im = Image.open(image)
tempfile = im.rotate(270)
tempfile_io =StringIO.StringIO()
tempfile.save(tempfile_io, format='JPEG')
image_file = InMemoryUploadedFile(tempfile_io, None, 'rotate.jpg','image/jpeg',tempfile_io.len, None)
img = Photo(user=user)
img.img.save('rotate.jpg', image_file)
img.save()
旋转后的图像存在于目录中,但是当我尝试将该图像添加到我的模型时,它不会保存。我错过了什么?非常感谢您的帮助。我用以下代码解决了这个问题:
image = ContentFile(b64decode(part.get_payload()))
im = Image.open(image)
tempfile = im.rotate(90)
tempfile.save("/srv/www/mysite.com/public_html/media/images/rotate.jpg", "JPEG")
img = Photo(user=user)
img.img.save('rotate.jpg', tempfile)
img.save()
image = ContentFile(b64decode(part.get_payload()))
im = Image.open(image)
tempfile = im.rotate(270)
tempfile_io =StringIO.StringIO()
tempfile.save(tempfile_io, format='JPEG')
image_file = InMemoryUploadedFile(tempfile_io, None, 'rotate.jpg','image/jpeg',tempfile_io.len, None)
img = Photo(user=user)
img.img.save('rotate.jpg', image_file)
img.save()
我在这里找到了答案。完美地工作 来自django.db导入模型的
from.abstract\u类导入DateTimeCreatedModified
从PIL导入图像
从io导入字节io
从django.core.files.base导入内容文件
从枚举导入枚举
类MediaSize(枚举):
#大小基本文件名
默认值=((10801080),“总线默认值”)
中等=((612612),“中等总线”)
缩略图=((161161),“总线缩略图”)
类媒体(DateTimeCreatedModified):
#原始图像。
original=models.ImageField()
#调整大小的图像。。。
默认值=models.ImageField()
medium=models.ImageField()
缩略图=models.ImageField()
def大小调整img(自身、img_大小):
img:Image.Image=Image.open(self.original)
img.缩略图(img_大小、图像、抗锯齿)
outputIO=BytesIO()
保存(输出,格式=img.format,质量=100)
返回输出,img
def HandlerResize(自身,mediaSize:mediaSize):
imgSize=mediaSize.value[0]
imgName=mediaSize.value[1]
输出,img=self.resizeImg(imgSize)
返回{
#文件不会被覆盖
#因为'AWS\u S3\u FILE\u OVERWRITE=False`
#在“settings.py”中设置。
'name':f'{imgName}.{img.format}',
“内容”:内容文件(outputIO.getvalue()),
“保存”:False,
}
def保存(自身,**kwargs):
如果不是self.default:
self.default.save(
**self.handleResize(MediaSize.DEFAULT)
)
如果不是自媒体:
自我保存(
**self.handleResize(MediaSize.MEDIUM)
)
如果不是self.缩略图:
自我保存(
**self.handleResize(MediaSize.缩略图)
)
super().save(**kwargs)
是否出现特定错误?你能分享一下你对照片的模型定义吗?我很确定这不是模型。如果我将“img.img.save('rotate.jpg',tempfile')中的“tempfile”替换为“image”,则会正确保存。因此,在保存图像后,我似乎无法正确访问新创建和旋转的图像文件。如果保存的是im
,而不是tempfile
,是否会出现同样的问题?是的,尝试了一些方法,但似乎仍然无法使其正常工作。好像图像不是一个有效的文件对象。恐怕我没有很多好主意。你现在可以绕道而行了。当打开
时,关闭临时文件并使用路径保存它。如果你想提高效率,那就不太好,但应该作为权宜之计。您看过issubclass
和tempfile
上的类似内容了吗?能否输入您的导入,以便我们知道您从哪里获取了所有必需的类,提前感谢!注意:从python3变更日志中:StringIO和cStringIO模块已经消失。相反,请导入io模块,并分别对文本和数据使用io.StringIO或io.BytesIO。