RTa*_*Tan 1 python django python-imaging-library
我对 python 和 django 非常陌生。我使用 django 开发了一个项目。这里所有的图像都带有水印。我使用以下代码为所有图像添加了水印......
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
Run Code Online (Sandbox Code Playgroud)
我的所有图像现在都带有水印。但问题是,作为用户,如果我下载这些图像,我发现下载的图像也带有水印,但我想下载实际图像,而不是带水印的图像,我该怎么办解决这个问题?
您需要将带水印的图像存储到不同的文件中。首先,您需要创建另一个列来存储带水印的图像。
class Photo(models.Model):
...
watermarked_photo = ImageField()
Run Code Online (Sandbox Code Playgroud)
然后,当您将带水印的图像保存到该列中时。
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
Run Code Online (Sandbox Code Playgroud)
我的 Django 技能有点生疏,所以如果不做一些修改,这段代码可能无法工作。但这个想法应该是扎实的。
如果您只想使用临时文件,请尝试此
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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
9081 次 |
| 最近记录: |