Измените размер изображений в каталоге

Моей первой мыслью для не-юникодной версии было сделать что-то вроде этого:


bool caseInsensitiveStringCompare(const string& str1, const string& str2) {
    if (str1.size() != str2.size()) {
        return false;
    }
    for (string::const_iterator c1 = str1.begin(), c2 = str2.begin(); c1 != str1.end(); ++c1, ++c2) {
        if (tolower(*c1) != tolower(*c2)) {
            return false;
        }
    }
    return true;
}
6
задан Juha Syrjälä 8 May 2010 в 10:25
поделиться

6 ответов

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

11
ответ дан 8 December 2019 в 02:18
поделиться

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

newIm = im.resize((newW, newH)

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

Пройдите через folder рекурсивно и примените функцию изменения размера ко всем изображениям.

Я придумал образец сценария, который, я думаю, вам подойдет. Вы можете улучшить его: возможно, сделать его графическим, добавить больше параметров, например, такое же расширение или может быть весь 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)
17
ответ дан 8 December 2019 в 02:18
поделиться

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

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 ... - на всякий случай, если изменение размера (по какой-либо причине) не сработает.

10
ответ дан 8 December 2019 в 02:18
поделиться

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

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

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

1
ответ дан 8 December 2019 в 02:18
поделиться

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

0
ответ дан 8 December 2019 в 02:18
поделиться

Use PerlMagick, it's an interface to the popular ImageMagick suite of command line tools to do just this kind of stuff. PythonMagic is available as well.

2
ответ дан 8 December 2019 в 02:18
поделиться