Изменить размер изображения в каталоге - PullRequest
6 голосов
/ 26 июня 2009

У меня есть каталог, полный изображений, размер которого я хотел бы изменить примерно до 60% от их первоначального размера.

Как бы я поступил так? Может быть в Python или Perl

Приветствия

Eef

Ответы [ 6 ]

17 голосов
/ 26 июня 2009

Если вы хотите сделать это программно, что, как я полагаю, имеет место, используйте PIL для изменения размера, например

newIm = im.resize((newW, newH)

затем сохраните его в том же файле или в новом месте.

Рекурсивно просмотрите папку и примените функцию изменения размера ко всем изображениям.

Я придумал пример сценария, который, я думаю, будет работать для вас. Вы можете улучшить его: возможно, сделайте его графическим, добавьте больше опций, например. то же расширение или может быть все PNG, изменение размера выборки линейный / билинейный и т. д.

import os
import sys
from PIL import Image

def resize(folder, fileName, factor):
    filePath = os.path.join(folder, fileName)
    im = Image.open(filePath)
    w, h  = im.size
    newIm = im.resize((int(w*factor), int(h*factor)))
    # i am saving a copy, you can overrider orginal, or save to other folder
    newIm.save(filePath+"copy.png")

def bulkResize(imageFolder, factor):
    imgExts = ["png", "bmp", "jpg"]
    for path, dirs, files in os.walk(imageFolder):
        for fileName in files:
            ext = fileName[-3:].lower()
            if ext not in imgExts:
                continue

            resize(path, fileName, factor)

if __name__ == "__main__":
    imageFolder=sys.argv[1] # first arg is path to image folder
    resizeFactor=float(sys.argv[2])/100.0# 2nd is resize in %
    bulkResize(imageFolder, resizeFactor)
11 голосов
/ 26 июня 2009

Как насчет использования mogrify, части ImageMagick ? Если вам действительно нужно управлять этим из Perl, то вы можете использовать Image :: Magick , Image :: Resize или Imager .

10 голосов
/ 26 июня 2009

Может ли это быть в оболочке?

mkdir resized
for a in *.jpg; do convert "$a" -resize 60% resized/"$a"; done

Если у вас> 1 ядро, вы можете сделать это так:

find . -maxdepth 1 -type f -name '*.jpg' -print0 | xargs -0 -P3 -I XXX convert XXX -resize 60% resized/XXX

-P3 означает, что вы хотите изменить размер до 3 изображений одновременно (распараллеливание).

Если вам не нужно хранить оригиналы, вы можете использовать mogrify, но я предпочитаю использовать convert, а затем rm ...; mv ... - просто чтобы быть в безопасности, если изменение размера (по любой причине) не удастся.

2 голосов
/ 26 июня 2009

Используйте PerlMagick , это интерфейс к популярному набору инструментов командной строки ImageMagick для выполнения подобных задач. PythonMagic также доступен.

1 голос
/ 26 июня 2009

Я использую Python с PIL (библиотека изображений Python). Конечно, есть специальные программы для этого.

Многие люди используют PIL для таких вещей. Посмотрите на: Быстрое изменение размера изображения с помощью Python

PIL очень мощный, и недавно я нашел этот рецепт: Помещение водяного знака на изображения в пакете

0 голосов
/ 26 июня 2009

вам нужно просто изменить его размер или вы хотите изменить программный размер? Если просто измените размер, используйте PixResizer. http://bluefive.pair.com/pixresizer.htm

...