首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在django中将图像保存在临时文件中

在django中将图像保存在临时文件中
EN

Stack Overflow用户
提问于 2014-06-04 09:39:07
回答 1查看 8.7K关注 0票数 0

我是python和django的新手,我用django开发了一个项目。这里所有的图像都是水标,我用下面的代码给所有的图像打了水印..。

代码语言:javascript
运行
复制
from PIL import Image
    def image_watermark(request,image_id):
        photo = Photo.objects.get(pk=image_id)
        watermark = Image.open('{0}/{1}'.format(settings.MEDIA_ROOT,'wmark.png'))
        img = Image.open(photo.photo.file)

        img.paste(watermark,(img.size[0]-watermark.size[0],img.size[1]- watermark.size[1]),watermark)

        img.save('{0}/{1}'.format(settings.MEDIA_ROOT,photo.photo.name), quality=80)


        wrapper = FileWrapper(open(photo.photo.url, 'rb'))
        response = StreamingHttpResponse(wrapper, 'image/jpeg')
        response['Content-Length'] = os.path.getsize(photo.photo.url)
        response['Content-Disposition'] = 'attachment; filename=photo.jpg'
        return response

我所有的图像都是有水印的now.But问题是,作为用户,如果我下载这些图像,我发现下载的图像也是水印的,但是我想下载实际的图像,而不是水印图像,我如何解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-06-04 10:57:57

您需要将水印图像存储到不同的文件中。首先,您需要创建另一个列来存储水印图像。

代码语言:javascript
运行
复制
class Photo(models.Model):
    ...
    watermarked_photo = ImageField()

然后,当您将水印图像保存到该列中时。

代码语言:javascript
运行
复制
from PIL import Image
def image_watermark(request,image_id):
    photo = Photo.objects.get(pk=image_id)

    # Only need to watermark when there's no watermark
    if not photo.watermarked_photo.name:
        photo.watermarked_photo.name = 'watermarked_' + photo.photo.name
        watermark = Image.open('{0}/{1}'.format(settings.MEDIA_ROOT,'wmark.png'))
        img = Image.open(photo.photo.file)
        img.paste(watermark,(img.size[0]-watermark.size[0],img.size[1]- watermark.size[1]),watermark)
        img.save('{0}/{1}'.format(settings.MEDIA_ROOT, photo.watermarked_photo.name), quality=80)
        photo.save()

    wrapper = FileWrapper(open(photo.watermarked_photo.url, 'rb'))
    response = StreamingHttpResponse(wrapper, 'image/jpeg')
    response['Content-Disposition'] = 'attachment; filename=photo.jpg'
    return response

我的Django技能有点生疏,所以如果不做一些修改,这段代码可能无法工作。但这个想法应该是坚实的。

如果您只想使用临时文件,请尝试如下

代码语言:javascript
运行
复制
from PIL import Image
import tempfile

def image_watermark(request,image_id):
    photo = Photo.objects.get(pk=image_id)
    watermark = Image.open('{0}/{1}'.format(settings.MEDIA_ROOT,'wmark.png'))
    img = Image.open(photo.photo.file)
    img.paste(watermark,(img.size[0]-watermark.size[0],img.size[1]- watermark.size[1]),watermark)

    tmpfile = tempfile.TemporaryFile()
    img.save(tmpfile, img.format, quality=80)

    tmpfile.seek(0)
    wrapper = FileWrapper(tmpfile)
    response = StreamingHttpResponse(wrapper, 'image/jpeg')
    response['Content-Disposition'] = 'attachment; filename=photo.jpg'
    return response
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24033960

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档