Как стать автором
Обновить

Сортировка изображений по разрешению с помощью Ruby и RMagick

Время на прочтение2 мин
Количество просмотров871
Доброго времени суток. Читая хабр, я наткнулся на статью «Сортировка изображений по разрешению с помощью Python и PIL» (позднее появилась статья «Сортировка изображений по разрешению… на сцене PowerShell» ), почитал комментарии и захотелось написать что-то подобное на Ruby.
image

Прошу не судить меня, а только критиковать! На самом деле только недавно начал изучать Ruby, а точнее это моя первая программа, так что любые найденные ошибки будут только на пользу. Программа написана на Ruby с использованием библиотеки RMagick. Как работает программа:

1) Пользователь вводит путь к директории с картинками (jpg,png,gif расширяется элементарно — (jpg|png|gif|другие форматы)
2) Потом путь к папке, в которой будут созданы поддиректории с именем равным разрешению картинок.
3) Далее программа «бегает» рекурсивно по директориям с картинками, найдя файлы с расширением jpg|png|gif, определяется разрешение и проверяется наличие директории с соответствующим разрешением в названии, если такой нет — создает.
4) Копирует файл, считает количество копированных файлов.

Код на Ruby выглядит немного красивее — мое мнение. Думаю, некоторым людям будет интересно сравнить аналогичный код Ruby и Python, вот только в моей программе копирование файлов вместо перемещения.

Что не сделано: проверка на существование копируемого файла и в случае существования – переименовывание.

Copy Source | Copy HTML
  1. require 'find'
  2. require 'fileutils'
  3. require 'RMagick'
  4.  
  5.  
  6. def image_sort(unsort_path, sort_path)
  7.   count =  0
  8.   if !File.directory?(sort_path)
  9.     FileUtils.mkdir sort_path
  10.   end
  11.   if File.directory?(unsort_path)
  12.   Find.find(unsort_path) { |fname|
  13.     if /\.(jpg|png|gif)$/i =~ fname
  14.       count += 1
  15.       img = Magick::Image::read(fname).first
  16.       wh_dir_name = img.columns.to_s + 'x' + img.rows.to_s
  17.       if !File.directory?(sort_path + wh_dir_name)
  18.         FileUtils.mkdir sort_path + wh_dir_name
  19.       end
  20.       FileUtils.cp(fname, sort_path + wh_dir_name)
  21.       puts fname + ' copied'
  22.     end
  23.   }
  24.   else
  25.     puts unsort_path + ' not found'
  26.   end
  27.   puts count.to_s + ' file(s) copied'
  28. end
  29.  
  30. puts 'Path to pictures: '
  31. pd = gets
  32. pd.chomp!
  33. puts 'Path to new sort directory: '
  34. sd = gets
  35. sd.chomp!
  36. image_sort( pd, sd )


Результат:
image
image
Так получилось, что картинки для теста имели разный размер.
Теги:
Хабы:
Всего голосов 16: ↑10 и ↓6+4
Комментарии8

Публикации

Истории

Ближайшие события

15 – 16 ноября
IT-конференция Merge Skolkovo
Москва
22 – 24 ноября
Хакатон «AgroCode Hack Genetics'24»
Онлайн
28 ноября
Конференция «TechRec: ITHR CAMPUS»
МоскваОнлайн
25 – 26 апреля
IT-конференция Merge Tatarstan 2025
Казань