从单个图像生成数百种分辨率


8

我正在开发一个项目,我需要多个分辨率的单个图像。幸运的是,图像具有相同的宽度/高度分辨率,并且适用于具有相同高度和宽度的所有分辨率,即80x80px 100x100px等。

显然我可以在Adobe Photoshop中手动完成这项工作,但我确实需要数百种不同的分辨率,从73px一直到1000px,这需要花费大量的手动时间。我搜索了网络,我一直得到的是缩略图生成器或Adobe Photoshop批处理保护程序,这仍然需要相当长的时间。

因此,这让我想到了我的问题,如何在Windows或Linux中尽快从单个图像创建数百个分辨率。


1)他们有像ImgIx这样的CDN,可以动态调整图像大小。2)我使用了Smaller Animals的ThumbNailer(15美元)批量处理图像。您只需通过命令行运行它,并配置“配置文件”并通过命令行调用。对于每个分辨率,您需要一个单独的配置文件。由于您的图像是1:1,并且您不需要任何“智能”调整大小选项,我认为ImageMagick将绰绰有余。
太阳

您可以使用单个矢量图像吗?
Anonsage 2015年

2
我很好奇这个项目需要数百个不同大小的相同图像。这与答案无关,但我很好奇。
Web Head

2
SURE你需要这么多分辨率的图像?再考虑一下,更加谨慎。与其他人讨论。我不能排除有一个边缘情况,在这种情况下确实如此,但如果我不得不打赌,我敢打赌“你做错了”。
o0'。

@Lohrois你的权利我们并不需要它们,但是为了总共30mb(1000pngs),对于未使用的PNG来说这不是一个大问题。
Simon Hayter 2015年

Answers:


19

我想基于源图像制作大量图像!

显然,我可以在Adobe Photoshop中手动执行此操作......这需要花费大量的手动时间。

你是对的。让计算机轻松重复工作; 这就是他们擅长的。正如Tom Ruh的回答所说,你可以使用ImageMagick它。

但是,有一个问题:

幸运的是,图像分辨率为4:3,适用于所有具有相同高度和宽度的分辨率,即80x80px 100x100px等。

(强调我的)

目前尚不清楚你想要什么样的分辨率 - 如前所述的4:3,或暗示的1:1。

然而,根据您的要求最小73px最大1000个像素分辨率的hundereds ; 我写了一个小脚本,它应该涵盖大多数可能性(包括你想要的机会调整大小)可以通过改变一些变量来设置。

脚本,也可以从pastebin这里获得,以便于复制

#!/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

注意:在计算值等的子壳上有点过分,但嘿嘿。如上所述,printf可以取消注释这些行以了解正在发生的事情,否则默认情况下它将根据静默规则默默运行。有些图像的尺寸不会与计算的尺寸完全一致(例如193px vs 138.54545454545454545452px),因为您无法以有用的方式获得分数像素。


1
呜啊,太棒了!刚刚测试过并且它工作得很可爱,但遗憾的是这会产生一个新的文件标签问题,因为1,2,3,4等不会通知我分辨率而无需进行数学计算或检查图像。你碰巧知道如何调整脚本来附加文件名的解析,filename-500x500.png而不是filename-1.png
Simon Hayter 2015年

很高兴它对您或多或少的满意度起作用。感谢您的澄清,我将使用更具描述性的文件名更新答案。就filename-width.png足够了?其中一种模式(保持原始宽高比)不直接计算显式高度。我可以轻松地获取信息(通过identify),但在原始宽高比的情况下,它将节省额外的每个图像调用。
伯蒂克2015年

哇,谢谢快速反应!是的,宽度将完成工作,因为我自动假设高度相同的数字。
Simon Hayter 2015年

关于我所说的4:3是电视和显示器中的宽高比,方形的..即google.co.uk / ...而不是信箱16:9等
Simon Hayter 2015年

1
我得下载它,谢谢!聆听!....你的传奇,剧本很棒!谢谢你的帮助。
Simon Hayter 2015年

7

只要你能处理一些命令行并编写一些简单的BASH脚本。您可以使用ImageMagick


1
如果分辨率是4:3宽高比,那么对于4像素宽,你再去3。此外,80x80或100x100分辨率的宽高比为1:1。由于您从4:3的比例变为1:1的比例,您将需要拉伸图像或裁剪多余的像素。不确定是否重要,但你不能保持4:3的分辨率来避免这种情况吗?
Geruta 2015年

1
知道解决方案是可行的,这是令人欣慰的,但这并没有回答如何实现它。你能用一个例子或一些说明扩展你的答案吗?谢谢。
fixer1234 2015年

:1)你可以使用CONVERT.EXE这与调整大小选项ImageMagic的一部分imagemagick.org/discourse-server/viewtopic.php?t=15438
太阳
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.