Gere centenas de resoluções a partir de uma única imagem


8

Estou trabalhando em um projeto em que preciso de uma única imagem em várias resoluções. Por sorte, a imagem tem resolução idêntica em largura / altura e funcionaria bem com todas as resoluções com a mesma altura e largura, ou seja, 80x80px 100x100px etc.

Obviamente, eu poderia fazer isso manualmente no Adobe Photoshop, mas literalmente preciso de centenas de resoluções diferentes, de 73px a 1000px e isso levaria um tempo bobo manual. Eu pesquisei na net e tudo o que recebo são geradores de miniaturas ou protetor de lote do Adobe Photoshop, que ainda levaria um tempo considerável.

Então, o que me leva à minha pergunta: como criar centenas de resoluções a partir de uma única imagem o mais rápido possível, no Windows ou no Linux.


1) eles têm CDNs como o ImgIx que redimensionam imagens dinamicamente para você. 2) Eu usei o ThumbNailer da Smaller Animals (US $ 15) para processar imagens em lote. Você apenas executa-o via linha de comando com "perfis" configurados e chama através da linha de comando. Para cada resolução, você precisaria de um perfil separado. Como suas imagens são 1: 1 e você não precisa de opções de redimensionamento "inteligentes", acho que o ImageMagick será mais que suficiente.
Sun

Você poderia usar uma única imagem vetorial?
Anonsage

2
Estou curioso quanto ao projeto que exigiria centenas da mesma imagem em tamanhos diferentes. Não é relevante para a resposta, mas, no entanto, estou curioso.

2
Tem certeza de que precisa de uma imagem em tantas resoluções? Pense nisso novamente, com muito mais cuidado. Discuta com outras pessoas. Não posso descartar que há um caso de risco em algum lugar em que esse é realmente o caso, mas se eu tivesse que apostar, apostaria em "você está fazendo errado".
o0 '.

@Lohrois você está certo, não precisamos de todos eles, mas, com o total de 30mb (1000pngs), não é um grande problema para os PNGs não utilizados.
Simon Hayter

Respostas:


19

Quero fazer muitas imagens com base em uma imagem de origem!

Obviamente, eu poderia fazer isso manualmente no Adobe Photoshop ... e isso levaria uma quantidade absurda de tempo manual.

Você está tão certo. Deixe o computador fazer o trabalho repetitivo fácil; é nisso que eles são bons. Como observa a resposta de Tom Ruh , você pode usar ImageMagickpara isso.

No entanto, há um problema:

Por sorte, a imagem tem resolução 4: 3 e funcionaria bem com todas as resoluções com a mesma altura e largura, ou seja, 80x80px 100x100px etc.

(ênfase minha)

Não está claro qual a resolução que você deseja - 4: 3 conforme indicado ou 1: 1 como implícito.

No entanto, com base nos seus requisitos de 73px mínimo e 1000px máximo e centenas de resoluções ; Eu escrevi um pequeno script que deve abranger a maioria das possibilidades (incluindo redimensionamento líquido na chance que você desejar) que pode ser definido alterando algumas variáveis.

Script, também disponível em pastebin aqui para facilitar a cópia :

#!/bin/bash
# resizer.sh - resize target image between two resolutions
# accepts file as either first argument or by setting FILEPATH variable

# SETTINGS

SMALLEST_WIDTH=73   # px
LARGEST_WIDTH=1000  # px
FILEPATH=           # set if you don't want to pass in image as argument
NUM_OF_RESOLUTIONS=100      # number of images generated; will generate between
                    # $SMALLEST_WIDTH and $LARGEST_WIDTH
RATIO=                      # set if you want to specify width/height
                    # (eg 1/1, 4/3, 16/9), blank is preserve current ratio


# NOTE: resizing to other aspect ratios may be slow/distorty:
# as per http://www.imagemagick.org/Usage/resize/#noaspect
# Seamless resizing (default) may be preferred, see:
# http://www.imagemagick.org/Usage/resize/#liquid-rescale
# but note it is slower, particularly as images get larger

LIQUID=0

# SCRIPT BELOW
# silent by default; uncomment "printf" lines for a description of what is happening
die() { printf "$@\n" 1>&2 ; exit 1; }

if [ -z "$FILEPATH" ]; then
    if [ -z "$1" ]; then die "Need to supply file to work on either as argument or by setting FILEPATH!";
    else FILE="$1";
    fi
else
    FILE="$FILEPATH"
fi

# check file exists and is regular file

if [ ! -e "$FILE" ]; then die "$FILE does not exist!"; fi
if [ ! -f "$FILE" ]; then die "$FILE is not a regular file!"; fi

i=0
step=$(echo "($LARGEST_WIDTH - $SMALLEST_WIDTH) / ($NUM_OF_RESOLUTIONS - 1)" | bc -l)
#printf "Resolution step is: %s\n-------------" "$step"
while [ $i -lt $NUM_OF_RESOLUTIONS ]; do
    # handle ratio
    WIDTH=$(echo "$SMALLEST_WIDTH+($step*$i)" | bc -l)
    if [ -z "$RATIO" ]; then
            #printf "convert %s -resize %s %s\n" "$FILE" "$WIDTH" "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}"
            convert "$FILE" -resize "$WIDTH" "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}"
    else
            HEIGHT=$(echo "$WIDTH * $RATIO" | bc -l)
            if [ "$LIQUID" -eq 0 ]; then
                    # Uncomment convert line for distorted ("squashed") resizing
                    #printf "convert %s -resize %sx%s\! %s\n" "$FILE" "$WIDTH" "$HEIGHT" "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}"
                    convert "$FILE" -resize "$WIDTH"x"$HEIGHT"\! "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}"
            else
                    # Liquid resizing: http://www.imagemagick.org/Usage/resize/#liquid-rescale
                    # fast aspect ration resize first, then liquid
                    #printf "convert %s -resize %s %s\n" "$FILE" "$WIDTH" "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}"
                    convert "$FILE" -resize "$WIDTH" "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}"
                    #printf "%s details are now:\n %s\n" "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}" "$(identify "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}")"
                    #printf "convert %s -liquid-rescale %sx%s\! %s\n" "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}" "$WIDTH" "$HEIGHT" "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}"
                    convert "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}" -liquid-rescale "$WIDTH"x"$HEIGHT"\! "${FILE%.*}-${WIDTH%.*}px.${FILE##*.}"
            fi
    fi
    (( i++ ))
done

Notas: Um pouco exagerado nas sub-conchas para calcular valores e tal, mas ei ho. Como observado, as printflinhas podem ser descomentadas para ter uma idéia do que está acontecendo, caso contrário, ela funcionará silenciosamente por padrão, conforme a Regra do Silêncio . Algumas imagens não terão as dimensões exatamente como calculadas (por exemplo, 193px vs 138,54545454545454545452px) porque você não pode, de maneira útil, ter pixels fracionários.


1
Woohoo, incrível! acabou de testar e funcionou adorável, infelizmente, porém, isso cria uma nova edição de rótulos de arquivo, pois 1, 2, 3, 4 etc. não me informam a resolução sem ter que fazer algumas contas ou inspecionar a imagem. Por acaso você sabe como eu posso adaptar o roteiro para a resolução de acréscimo para filename ou seja filename-500x500.png, em vez defilename-1.png
Simon Hayter

Ainda bem que funciona para sua satisfação mais ou menos. Obrigado por esclarecer, atualizarei a resposta com um nome de arquivo mais descritivo. Seria filename-width.pngsuficiente? Um dos modos ( manter a proporção original ) não calcula diretamente uma altura explícita. Consigo facilmente obter as informações (via identify), mas isso salvaria uma chamada por imagem adicional em casos de proporção original.
22815 bertieb

Uau, obrigado pela resposta rápida! sim, a largura faria o trabalho, já que eu assumiria automaticamente o mesmo número para a altura.
Simon Hayter

No que diz respeito sobre o que eu quis dizer com 4: 3 foi proporção encontrada em TVs e monitores, os quadrados .. ou seja google.co.uk/... não letter box 16 e: 9 etc.
Simon Hayter

1
Vou ter que fazer o download, obrigado! ouça! .... você é uma lenda, o script funciona incrivelmente! obrigado por toda sua ajuda.
21815 Simon Hayter

7

Contanto que você possa lidar com alguma linha de comando e escrever alguns scripts BASH simples. Você pode usar o ImageMagick


1
Se a resolução estiver na proporção de aspecto 4: 3, para sempre 4 pixels de largura, você aumentará mais 3. Além disso, as resoluções 80x80 ou 100x100 têm uma proporção de 1: 1. Como você passa de uma proporção de 4: 3 para 1: 1, será necessário esticar a imagem ou cortar o excesso de pixels. Não tenho certeza se isso importa, mas você não pode simplesmente manter sua resolução 4: 3 para evitar isso?
Geruta 13/07/2015

1
É reconfortante saber que uma solução é possível, mas isso não responde como realizá-la. Você pode expandir sua resposta com um exemplo ou algumas instruções? Obrigado.
fixer1234

1) Você pode usar convert.exe, que faz parte do ImageMagic, com a opção -resize: imagemagick.org/discourse-server/viewtopic.php?t=15438
Dom
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.