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

标签 python django image django-models watermark

我正在创建一个 django 项目,其中我使用 ImageField 将图片(图像)存储在数据库中...

original_pic = models.ImageField()

另外,我想存储一个包含相同图片(图像)的图像 作为 original_pic ,另一个 ImageField 中的水印为..

watermark_pic = models.ImageField(default=watermarkImage())

简而言之,我只想在 original_pic 上应用算法并使用 django 模型将结果保存在 watermark_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)
    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_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)

关于python - 创建从 django 模型中的另一个 ImageField 派生的 django ImageField,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51800593/

相关文章:

java - 将图像裁剪得更大

python - 从 HSV 获取亮度值 - Python

django - 导入错误: No module named 'models' in Python 3

python - EC2上的Python脚本返回错误的签名类型错误

每种语言的 django cms 权限

django - 尝试启动 Daphne systemctl 进程时权限被拒绝

image - 使用libgdx,如何将文本和图像同时添加到ScrollPane?

android - Facebook 使用什么库通过拖动来关闭图像?

python - 在连续时间帧上应用 IIR 滤波器时的连续性问题

python - 如何在使用 QSplitter 时固定一个小部件