Сжать картинки по условию

  • Автор темы Автор темы Absolute
  • Дата начала Дата начала

Absolute

Разрушитель (V)
Сообщения
54
Реакции
33
Баллы
249
Суть: есть хулиард изображений, разложенных по папкам.
Задача: выбрать и сжать из всех папок только те картинки, у которых ширина или высота, например, больше 1200px. Или как вариант, размер файла больше, например, 500кб.
Нужна прога, желательно под винду. Может кто знает или решал что-то подобное?
 
Также есть утилита для cmd https://www.xnview.com/en/xnconvert/
И да, самой программе есть русский интерфейс (хотя не очень понятно зачем он).
XnConvert у меня давно стоит, но что-то сжатия или выборки по условию не нашел там.
Сделал проще - скачал на винду Node.js , создал проект.
Код:
npm install --save image-size
npm install --save jimp
JavaScript:
const fs = require('fs');
const size = require('image-size');
const Jimp = require('jimp');

function getFiles(dir, images) {

    images = images || [];
    let fileList = fs.readdirSync(dir);

    for(let i=0; i<fileList.length; i++) {
        let path = dir + '/' + fileList[i];
        let stat = fs.statSync(path);
        if(stat.isDirectory()) {
            getFiles(path, images);
        }
        else {
            let ext = path.match(/[^.]+$/g)[0].toLowerCase();
            if(ext == 'jpg') {
                let dimens = size(path);
                if(dimens.width > 1000 || dimens.height > 1000){
                  images.push({
                      name : path,
                      width : dimens.width,
                      height : dimens.height,
                      size : stat.size,
                      ext : ext
                  });
                }
            }
        }
    }
    return images;
}

let imgObjList = getFiles('D:\/bckup\/img\/p');

imgObjList.forEach(v=>{
   let w = v.width >= v.height ? 1000 : Jimp.AUTO;
   let h = v.width <= v.height ? 1000 : Jimp.AUTO;            
   let cb = function(){
       let newSize = fs.statSync(v.name).size;
       console.log('Файл: ' + v.name + ' | Уменьшен на: ' + Math.round((v.size - newSize)/1000) + 'Kb' )
   };
    Jimp.read(v.name)
          .then(img => {
              return img
                    .resize(w, h)
                    .quality(90)
                    .write(v.name, cb)
           })
          .catch(err => {
             console.error(err);
           });
   
});
Вроде норм отработал скрипт. Примерно час ~31к файлов и ~6к директорий из которых условию соответствовали 3900 файлов. Всё на HDD.
 
Последнее редактирование:
Назад
Верх