BANG

Есть ли способ переименовать изображения на основе их доминирующего цвета?


Цвет Пакетная обработка Окна Imagemagick Обработка изображения Дизайн

У меня есть папка, полная PNG-файлов, состоящих из одного цвета ... Вот несколько из них, чтобы дать представление о том, что я пытаюсь сделать:

Папка с цветами

Я хочу, чтобы имя файлов было их шестыми цветовыми кодами. Было бы очень приятно, если бы был какой-то автоматизированный способ сделать это.

Я знаю, что есть способы извлечь цветовой код из изображения ... Теоретически кажется, что должно быть возможно переименовать каждое изображение с его цветовым кодом.

Просто подумал, что я увижу, есть ли у кого-нибудь здесь какие-то идеи ... Я нахожусь в Windows

Кто угодно?

благодаря

Alin
Я считаю, что вам понадобится сценарий, написанный специально для этого. Насколько мне известно, у PS нет возможности сделать это из коробки.

joojaa
Да, ты можешь это сделать.

BANG
@joojaa Можете ли вы немного разобраться? В частности, КАК я могу это сделать?

Ответы


BANG

Хорошо, поэтому после некоторого значительного поиска я нашел решение этой «дилеммы» ... Я! Спасла меня так много работы

Главным ключом к тому, чтобы сделать все это возможно вообще, является смехотворно мощное (и бесплатное) программное обеспечение, известное как ImageMagick

* Примечание. В Windows по крайней мере для полной функциональности ImageMagick также требует установки Ghostscript .

Запуск имен файлов не имеет значения, потому что они обрабатываются с помощью «*» в качестве подстановочного знака ... Вот что я начал с:

Датированные имена файлов - бесполезные

Используя ImageMagick с помощью командной строки, я смог пробовать и извлекать цвет изображения, а затем переименовывать каждое изображение в соответствии с значениями RGB, выводить в десятичный формат, изменяя имена (для файла в правом верхнем углу изображения, найденного в например, оригинальный вопрос) от «2015-09-03_223717.png» до «rgb (102 130,154) .png».

Это делается с помощью следующей команды, запускаемой из папки:

 magick *. png - set  colorspace RGB - set  filename : f "%[pixel:p]"   %[ filename : f ]. png 

Это делает копию каждого файла PNG, сохраненного в той же папке, тогда оригиналы могут быть удалены. Таким образом, мы приближаемся на один шаг. Некоторые (например, пользователи ImageMagick) могут найти их более полезными, назвав их таким образом ... Вот результаты:

Десятичные коды RGB как имена файлов

Теперь нам нужно изменить имена файлов с десятичных цветовых кодов на шестнадцатеричные цветовые коды (в этом случае минус предыдущий символ «#») ...

В Windows это требует добавления инструмента * nix, известного как «sed», который я добавил с помощью GOW (GNU On Windows), который находится здесь: https://github.com/bmatzelle/gow

Итак, снова из командной строки в папке введите:

 for   % I in   (   *. png )   do   (  magick % I - resize 1x1 !  txt :   ^ 
    |  sed - e "s/^#.*$//g;s/^.* #\(.*\) .*$/ren %I \1\.png/g"   >>  hexnames . bat ) 

Это создаст (в той же папке) BAT-файл с необходимыми командами переименования для каждого файла. Тогда все, что нам нужно сделать, - это дважды щелкнуть полученный BAT-файл, чтобы запустить его.

Готово. Теперь файлы переименованы (например) из «rgb (102,130,154) .png» в «66829A.png». Конечный результат:

Цветовые коды Hex как имена файлов

joojaa
Существует опасность того, что вы вымываете свой цвет с масштабированием до 1x1, если у изображений есть что-то другое, кроме цвета (например, границ). Поэтому лучше использовать что-то вроде: convert image.png -crop 1x1+29+29 txt:- Ands пробовать один фиксированный пиксель, или если вам нужен кадр isrt, тогда масштабируйте. См. Средний цвет довольно далеко от преобладающего цвета.

BANG
@joojaa Ты совершенно прав. В моих примерах все изображения содержали только один цвет, чтобы изменить размер. В любом случае решение теперь изменилось. См. Мой новый ответ.

joojaa
Просто из любопытства, какова цель иметь изображения только одного цвета? Я имею в виду, не было бы легче сгенерировать их на лету? Или вы получаете их от некоторых измерений? В любом случае, вы уже получили мой +1 на ответ и вопрос.

BANG
Я на протяжении многих лет захватывал их, просто для вдохновения ... Мне нравились цвета, и поэтому я могу использовать эти индивидуальные цвета в качестве основы для создания полных цветовых комбинаций. Спасибо за голоса!

joojaa
Тем не менее, было бы легче сохранить значения. Какое практическое преимущество вы получаете за то, что у вас есть отдельные файлы? Я имею в виду, что вы можете создать изображение «на лету» практически в любом редакторе, в том числе в воображаемом.

BANG

Из-за моей «проблемы» мне удалось вдохновить создателей ImageMagick, чтобы добавить поддержку свойства «hex» для этого вывода ...

Чтобы сделать то, что я сделал в ответе выше, теперь выполняется только следующее:

 magick *. png - depth 8   - set  filename : f "%[hex:up{0,0}]"   %[ filename : f ]. png 

Так (например) файлы изображений будут переходить от "generic-filename.png" к "# EA4858.png"

Это оставляет мне всего пару проблем:

  1. Эта операция делает копию изображения (чего я не хочу)

  2. Включение символа «#» в имя файла (также нежелательное)

Итак, вот мое новое решение, основанное на последней стабильной версии ImageMagick ..., которая на данный момент составляет 7.0.5-10), все из командной строки Windows (при условии, что у вас установлен ImageMagick).

Сначала я хочу переименовать все файлы, чтобы дать им общий префикс, который я могу ссылаться позже ... Это собственная команда переименования Windows:

 REN "*.png"   "temp_*.png" 

Это выводит нас из "generic-filename.png" в "temp_generic-filename.png"

Я начинаю с изображений размером более 500 пикселей. Это намного больше, чем мне нужно ... Следующая строка разбивает их на более управляемый размер с помощью ImageMagick:

 magick mogrify - gravity Center   - crop 88x88 + 0 + 0   + repage *. png 

Следующий шаг также использует ImageMagick для выбора цвета (в этом верхнем левом углу в этом случае) и выводит эту информацию в имя файла копии, которую он делает в шестнадцатеричном формате:

 magick *. png - depth 8   - set  filename : f "%[hex:up{0,0}]"   %[ filename : f ]. png 

Теперь мы перешли от "temp_generic-filename.png" к (например) "# EA4858.png"

Теперь мне нужно удалить исходные изображения, так как копии получили шестнадцатеричные имена файлов. Снова используя Windows для удаления всех изображений PNG с префиксом temp_:

 DEL "temp_*.png" 

Последний шаг, который я собираюсь сделать, - удалить символ «#» из моих новых имен файлов с помощью «rename» еще раз:

 REN "*.png"   "/*.png" 

«/» В последнем бит удаляет первый символ. Чтобы удалить 2 или более символов (только с самого начала), просто добавьте две или более косой черты.

Теперь все вместе и запустите из командной строки в папке с изображениями:

 @ECHO  OFF FOR % a in   (*. png )  DO ( REN "*.png"   "temp_*.png" magick mogrify - gravity Center   - crop 88x88 + 0 + 0   + repage *. png magick *. png - depth 8   - set  filename : f "%[hex:up{0,0}]"   %[ filename : f ]. png DEL "temp_*.png" REN "*.png"   "/*.png"  
   ) 

Окончательные файлы теперь 88x88 и названы в соответствии с их шестнадцатеричным цветовым кодом следующим образом: «EA4858.png»

(ПРИМЕЧАНИЕ: Возможно (предположительно), что следующая версия ImageMagic может оставить символ «#» в этом выпуске, который тогда можно было бы легко добавить вручную, если это было необходимо. Если это произойдет, то последний шаг, очевидно, будет ненужным.)

Что-то, что я забыл сказать в своем первоначальном ответе: Массивная подсказка для экипажа в ImageMagick за то, что она так полезна!

joojaa
Имейте +1, чтобы быть более продуктивным членом

BANG
@joojaa Спасибо ...

BANG
Как я заметил, может случиться, что новая стабильная версия ImageMagick не будет REN "*.png" "/*.png" символ «#» ... Это означает, что последняя строка выше ( REN "*.png" "/*.png" ) больше не нужна.

BANG
Если вы хотите, чтобы символ просто добавлял его в начало так: "#%[hex:up{0,0}]"

joojaa

Теперь, когда у меня есть немного времени для решения вопроса, то есть в целом лучше подходит для переполнения стека, чем здесь. Давайте добавим еще несколько возможностей. Хотя я вообще думаю, что ImageMagick / GraphicsMagic - это способ быстро и грязно работать, стоит того, чтобы его установить. Кроме того, это агностика платформы, поэтому вы можете запускать ее даже на своем телефоне. Это не всегда лучший инструмент для работы, главным образом потому, что время от времени он имеет немного критический синтаксис.

Также ImageMagick не может быть лучшим инструментом, если у вас есть настоятельная необходимость определить, что означает доминирующее. В этом случае вам не нужно находить доминирующий цвет, так как вы можете просто выбрать один пиксель (это то, что плохо демонстрирует, обрезка и повторное запечатывание также возможны, но я оставлю это как упражнение по ручному чтению). В конце концов, общие вычисления, такие как обработка текста, проще вне пакетных файлов, и в конечном итоге их легче расширить.

Итак, некоторые альтернативные способы решения этой конкретной ситуации:

Powershell

Вы можете сделать это в powershell, используя встроенные функции windows. Преимущество такого подхода заключается в том, что он будет работать на машине с Windows без необходимости устанавливать что-либо (это в большинстве машин Windows 7 и во всех новых). Такой подход подходит для тех, кто имеет очень ограниченный доступ к средствам администрирования компьютеров.

 [ Reflection . Assembly ]:: LoadWithPartialName (“ System . Windows . Forms ”); 

 Get - ChildItem   *. png |   ForEach - Object   { $i =  new - object System . Drawing . Bitmap ( $_ . FullName ); $p =  $i . GetPixel ( 0 , 0 ); 
     Rename - Item  $_ . FullName   ( "{0:X2}{1:X2}{1:X2}.png"   - f $p . R ,  $p . G ,  $p . B )   - WhatIf ; 
 } 

Примечание . Удалите -WhatIf из окончательного сценария производства, он предназначен для безопасного тестирования. Это отличная особенность powershell

Дополнительные преимущества powershell включают:

  • Возможность доступа к окнам приложений. Таким образом, вы можете, например, сбрасывать результаты в indesign, photoshop, excel, word и т. Д. Напрямую.
  • Процесс можно легко демонизировать, чтобы реагировать на изменения папки. Таким образом, он может работать с переименованием файлов, упавших в папку
  • Перевод кода powershell в управляемый C ++, C # или VB.Net тривиален
  • Это, безусловно, наименее задействованный вариант: получить настоящего новичка, который будет использоваться, поскольку PowerShell ISE, который поставляется с окнами, достаточно прост в использовании.

питон

Теперь вы можете сделать это и в python. Python, как правило, mo goto для написания сценариев. В этом случае скрипт pythons довольно прост, если говорить scipy.

 from scipy . misc import imread from os import rename from glob import glob for  image_path in  glob ( "*.png" ): image =  imread ( image_path ,  mode = "RGB" ) newname =   '%02X%02X%02X.png'   %  tuple ( image [ 0 , 0 ,]. tolist ()) rename ( image_path ,  newname )   

Примечание : сначала резервное копирование!

ExtendScript

Вы также можете сделать это в расширении, используя, скажем, Photoshop. Недостатком является то, что он ужасно медленный и ужасно сложный. Но тогда преимущество состоит в том, что вы можете использовать все остальные средства Photoshop.

 #target photoshop var readFolder =  new Folder ( "C:/temp" ) var outFolder =   "C:/temp/output" var fileList =  readFolder . getFiles ( "*.png" ); 
 for ( var a =   0   ; a <  fileList . length ;  a ++) 
 { var fileName =  fileList [ a ]; doc =  app . open (  new File (  fileName )   ); doc . colorSamplers . removeAll (); var myColorSampler =  doc . colorSamplers . add ([ 0 , 0 ]); doc . saveAs (  new File (  outFolder + "/" +  myColorSampler . color . rgb . hexValue +   ".png" )); doc . close (); alert ( "done" ); 
 } 

Примечание . В сценарии отсутствуют проверки, чтобы они перезаписывали файлы с тем же именем и не работали для альфа-каналов, но все же.

В конце

Вы можете использовать почти любой язык программирования, и это не очень сложно в любом из них. Достаточно сказать, что решить, что использовать, это сложнее, чем на самом деле делать это. На самом деле IageMagick может быть особенно загадочным выбором для новичка, но стоит инвестиций.

Смотри также