Django图像大小调整脚本

时间:2018-08-20 06:36:34

标签: python django

嗨,我有一个项目,图像上传并保存在媒体的子文件夹中,并且从不设置图像大小,因此现在图像节省4mb,最终总计为40GB。

如果图像位于单个文件夹中,我知道如何编写脚本,但是有人可以指导我执行此操作以检查文件夹中的所有图像并调整其大小吗?即使它位于一个子文件夹和另一个子文件夹中。

使用Django和python

图像上传功能

def artwork_theme_name(instance, filename):
    path, name = get_hashed_upload_to(instance.id, filename)
    return 'theme/{}/{}'.format(path, name)

上传模型

class ArtworkForeground(models.Model):
    title = models.CharField(_("title"), max_length=128)
    description = models.TextField(_("description"))
    foreground = models.ImageField(_("foreground image"), upload_to=artwork_theme_name)

2 个答案:

答案 0 :(得分:4)

在这里,我覆盖具有缩小尺寸图像的现有图像。 artwork.foreground file-pointer,我们将fp传递给PIL类。 save()类的 Image 方法将filename / path-conatining-filename作为第一个参数。那时 .path 属性变得很方便

from PIL import Image


def do_resize(image):
    pil_img = Image.open(image)
    resize_limit = 100, 150
    pil_img.thumbnail(resize_limit, Image.ANTIALIAS)
    pil_img.save(image.path)


for artwork in ArtworkForeground.objects.filter(foreground__isnull=False):
    do_resize(artwork.foreground)

UPDATE-1
该片段应该放在哪里?

  

如果您从立即开始设置了某种 限制 验证 ,只需在您的 Django Shell 中运行此脚本(这仅一次使用)

答案 1 :(得分:0)

您可以使用os.walk()函数浏览所有文件和子文件夹。

for (path, dirs, files) in os.walk(path):
    for file in files:
        filename = os.path.join(path, file)
        if filename.endswith('.jpg'):
            resize_image(filename)