Como processar imagens JPG em lote para alterar sua qualidade com o Nautilus-Actions?

6

Primeiro de tudo: Obrigado por ler isto e oferecer ajuda. Quaisquer conselhos são apreciados.

Estou usando o Nautilus-Actions para adicionar uma ação do menu de contexto personalizado para criar uma cópia de uma imagem JPG e reduzir sua qualidade (e o tamanho do arquivo) preservando as dimensões da imagem.

Digamos que eu tenha esta foto com propriedades de imagem como tamanho de arquivo de 2,3 MB (2 261 588 bytes) e:

E, depois de abrir o arquivo no GIMP 2.8 para exportar apenas uma cópia e usar a caixa de diálogo Exportar JPG para reduzir a qualidade da imagem para 30%, como mostrado na próxima captura de tela:

Eu obtenho as propriedades da próxima imagem na cópia da imagem (251,8 kB (251 797 bytes) tamanho do arquivo):

Agora.

Estou usando o Nautilus Actions para processar em lotes muitas imagens para reproduzir o mesmo comportamento via menu de contexto, selecionando vários arquivos no Nautilus, clique com o botão direito do mouse em qualquer um desses arquivos selecionados e escolha o Nautilus correto. Ação ações. O resultado é um arquivo contendo a imagem nas mesmas dimensões do original, com menos qualidade de curso e o tamanho do arquivo é um pouco maior (275,3 kB (275 265 bytes)), mas isso não é um grande problema para mim. / p>

O problema

Está acontecendo quando tento processar em lote vários arquivos de imagem, o que resulta no primeiro nome de arquivo clonado em vários nomes de arquivo contendo uma imagem diferente em cada um. Com as propriedades que eu defini no próximo conjunto de comandos:

Basicamente, cada Ação do Nautilus está usando os próximos parâmetros:

Comando: convert

  • De (imagemagick)

Parâmetros: %F.jpg -quality 80%% %F-80q.jpg

  • Qual é interpretado como: convert path/to/file1.mid.jpg -quality=80% path/to/file1.mid-80q.jpg

Diretório de trabalho: %d

  • Explicou-se.

Assim, os resultados podem ser vistos nesta captura de tela:

Aqui podemos ver cada imagem processada em um arquivo diferente, mas apenas o primeiro nome do arquivo é usado para atribuir os novos nomes aos arquivos copiados. Eu desejo um resultado como:

File1.jpg === File1-80q.jpg
File2.jpg === File2-80q.jpg
File3.jpg === File3-80q.jpg
File4.jpg === File4-80q.jpg

E assim por diante ...

Eu usei o Phatch para fazer essas tarefas, mas o que desejo é apenas um clique direito nos arquivos selecionados e processar em uma única ação.

Existe uma maneira melhor de fazer isso? ou ... Posso melhorar de alguma forma o que já estou fazendo?

Muito obrigado pelo seu apoio.

P.S. Eu vi Como posso lote converter imagens para b / w, preservando a estrutura de pastas e Existe uma maneira de exportar em lotes SVGs para PNGs? , mas eu não estou tentando executar isso a partir de um terminal, mas a partir de um menu de contexto. Se estou omitindo alguma coisa neste exercício, não hesite em me avisar! Eu aprecio muito isso. Obrigada!

Editar

Depois de usar resposta do muru , acho que a solução faz parcialmente o que eu espero.

Mais especificamente, resolve o problema dos nomes de arquivos. No entanto, eu também esperava obter tamanhos menores de arquivos executando o comando convert file.jpg -quality 30% apropriado e ele está descartando tamanhos maiores de arquivos, como você pode ver na próxima imagem:

Alguém sabe se há algo mais que eu deveria adicionar aos parâmetros vistos na resposta do muru ? Eu aprecio muito os seus esforços para fornecer ajuda sobre este assunto.

Atualizar

Estou escrevendo isso para que as pessoas saibam que vi onde estava o problema da compactação. O arquivo que eu estava tentando comprimir já estava sendo comprimido o suficiente (como mencionado na resposta do muru ):

  

O processo estava apenas adicionando sobrecarga sem ganhar nada.

    
por Geppettvs D'Constanzo 19.04.2015 / 18:46

1 resposta

2

Você não pode usar %F duas vezes em um comando como esse, porque %F é substituído pelos nomes de todos os arquivos selecionados. Por exemplo, um comando de sh com os parâmetros -c 'printf "%%s\n" "$@" > foo' %F %F criará um arquivo chamado foo com os nomes de todos os arquivos selecionados, duas vezes. Portanto, o comando convert que realmente é executado é:

convert file1.jpg file2.jpg ... -quality 80% file1.jpg file2.jpg ... fileN.jpg-80q.jpg

E como o último arquivo é considerado o nome do arquivo de saída, somente isso será importante.

O que você pode fazer é incluir seu comando em bash -c e executar um loop:

bash -c 'for i; do convert "$i" -quality 80% "${i/%.jpg/-80q.jpg}"; done'

(onde suponho que todos os arquivos terminem com .jpg )

Em uma ação, você terá bash como o comando e para os parâmetros:

-c 'for i; do convert "$i" -quality 80%% "${i/%%.jpg/-80q.jpg}"; done' - %F

Você pode tornar isso mais complicado para lidar com qualquer extensão, quando você pode ignorar Ações e usar scripts.

    
por muru 19.04.2015 / 19:23