Python 创建从django模型中的另一个ImageField派生的django ImageField

Python 创建从django模型中的另一个ImageField派生的django ImageField,python,django,image,django-models,watermark,Python,Django,Image,Django Models,Watermark,我正在创建一个django项目,在这个项目中,我使用ImageField作为 original_pic = models.ImageField() 另外,我想存储一个包含相同图片的图像(图像) 作为原始图片,另一个图像字段中带有水印,如 watermark_pic = models.ImageField(default=watermarkImage()) 简而言之,我只想在原始图片上应用算法,并使用django模型将结果保存在水印图片中 将水印应用于图像的算法(逻辑)如下 def water

我正在创建一个django项目,在这个项目中,我使用ImageField作为

original_pic = models.ImageField()
另外,我想存储一个包含相同图片的图像(图像) 作为原始图片,另一个图像字段中带有水印,如

watermark_pic = models.ImageField(default=watermarkImage())
简而言之,我只想在
原始图片上应用算法,并使用django模型将结果保存在
水印图片中

将水印应用于图像的算法(逻辑)如下

def watermarkImage(filename, text, color, fontfamily):
    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)
    return Image.alpha_composite(image, imageWatermark)

注意:我知道在图像上应用水印的算法。

我不确定水印逻辑是什么样子。您可以通过重写
save()
方法来实现。无论如何,我为您制作了一个简单的工作图像旋转示例


from PIL import Image


def rotate_image(image_fp):
    im = Image.open(image_fp)
    rotate = im.rotate(45)
    filename = "rotated_" + image_fp.name
    rotate.save(filename)
    return filename


class MyBaseImageModel(models.Model):
    # your model
    original_pic = models.ImageField()
    watermark_pic = models.ImageField(null=True, blank=True)

    def save(self, *args, **kwargs):
        if not self.pk:
            rotate_img_name = rotate_image(self.original_pic)
            self.watermark_pic = rotate_img_name
        super().save(*args, **kwargs)
创建图像时,您不希望为
watermark\u pic


更新

def watermarkImage(filename, text, color, fontfamily):
    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_img = Image.alpha_composite(image, imageWatermark)
    my_img.save('water_'+filename.name)
    return 'water_'+filename.name

class MyBaseImageModel(models.Model):
    # your model
    original_pic = models.ImageField()
    watermark_pic = models.ImageField(null=True, blank=True)

    def save(self, *args, **kwargs):
        if not self.pk:
            rotate_img_name = watermarkImage(your args)
            self.watermark_pic = rotate_img_name
        super().save(*args, **kwargs)

原始图片
水印图片
是否在同一型号?还是在不同的模型中?@JerinterGeorge是的,它们在同一个模型中,你为什么要这样做?它将生成图像的相同副本..对吗?这是你需要的吗?@jerinterGeorge不,我不想要相同的副本,我想要一份图像的副本,上面添加了水印。也就是说,
Watermark\u pic
将包含带有水印的
original\u pic
副本…你能添加水印的逻辑吗?我已经尝试过了,它在旋转图像时工作得非常完美,但我在尝试添加水印逻辑时遇到以下错误<代码>“Image”对象在调用save()方法时没有属性“\u committed”
。你也遇到过类似的问题吗?仍然有一些错误
必须是str,而不是ImageFieldFile
再次进行了一些编辑…使用
filename.name
而不是
filename
(更新了答案)嘿,杰林,我几乎达到了我的预期。。。。。谢谢。。。。。现在唯一的问题是,
watermark\u pic
的图像没有存储在/media中,我已经为存储所有图像和上传设置了默认值…..再次感谢,棘手的部分是,将
'water'+filename.name
更改为
媒体URL
目录的绝对路径