自动调整“非视网膜”图像版本的大小

时间:2011-11-10 23:48:26

标签: xcode

我正在寻找一种解决方案,可以让我免于维护同一图像的两个版本,一个用于Retina显示器(又名@ 2x),另一个用于非Retina显示器。我的目标是仅维护“2x”图像,并且只需单击一下即可调整所有这些图像的“神奇工具”,甚至可以在XCode中构建。就像“设置并忘记它”一样。

你能帮帮我吗?提前谢谢。

9 个答案:

答案 0 :(得分:28)

如果您只想缩小它们,可以让Xcode在构建过程中自动生成所有非视网膜图像。此示例脚本使用“sips”,因为它预先安装在Mac上。

剧本

#!/bin/bash
# Downsamples all retina ...@2x.png images.

echo "Downsampling retina images..."

dir=$(pwd)
find "$dir" -name "*@2x.png" | while read image; do

    outfile=$(dirname "$image")/$(basename "$image" @2x.png).png

    if [ "$image" -nt "$outfile" ]; then
        basename "$outfile"

        width=$(sips -g "pixelWidth" "$image" | awk 'FNR>1 {print $2}')
        height=$(sips -g "pixelHeight" "$image" | awk 'FNR>1 {print $2}')
        sips -z $(($height / 2)) $(($width / 2)) "$image" --out "$outfile"

        test "$outfile" -nt "$image" || exit 1
    fi
done

自动执行

  • 创建一个新的“聚合目标”,将其命名为“Downsample images”。
  • 向运行脚本的目标添加“运行脚本”阶段。
  • 将“下采样图像”目标添加为应用目标中的“目标依赖关系”。

注释

请记住仍然将1x图像添加到Xcode项目中。根据您的需要,您可能还需要:

  • 从转化中排除某些文件
  • 将生成的文件添加到.gitignore文件
  • 使用ImageMagick的“convert”代替“sips”。 (对于某些索引的PNG,啜饮似乎失败了。)
  • 运行optipng

如果要检查缩减采样版本,ImageMagick会附带“compare”命令。

答案 1 :(得分:8)

这是一个很老的线索,但我偶然发现它,所以我可以详细说明自动维护多个尺寸。

在性能方面,我不确定使用自动缩减是一个明智的想法,因为它必须是实时完成的,但它应该适用于更简单的情况。

现在,要自动转换这些@2x图像,一个简单的bash脚本应该可以解决这个问题。 l4u 的解决方案可行,但对于需要更简单且不想安装guard的人来说,这也有效(但您仍然需要安装ImageMagick):

for f in $(find . -name '*@2x.png'); do
    echo "Converting $f..."
    convert "$f" -resize '50%' "$(dirname $f)/$(basename -s '@2x.png' $f).png"
done

答案 2 :(得分:3)

这很简单:

  1. 仅在项目中包含@ 2x图片。
  2. 确保这些图片的后缀为@ 2x。
  3. 系统将自动缩小非视网膜设备的尺寸。

    唯一的例外是如果您正在进行手动,低级Core Graphics绘图。如果是这样,您需要调整比例。但是99.9%,你不必担心这个。

答案 3 :(得分:0)

你只需要为你的应用程序使用*@2x.png图像。 但是你必须为imageviews设置内容模式= UIViewContentModeAspectfit, 然后它会自动将图像修复为releventimageviews。

答案 4 :(得分:0)

或者您还可以做的是:在第一次启动时,只在应用程序包中包含@ 2x图像。拍摄所有@ 2x照片并将它们缩小1/2并将它们存储在文档目录中。然后,当您需要UIImageView的照片时,只需抓住它们获取文档目录并使用代码而不是Interface Builder将其设置为UIImageView

几周前我也在想这个,我意识到这几乎是真正做你想要的事情的唯一途径!

答案 5 :(得分:0)

我创建http://l4u.github.com/blog/2012/04/02/resizing-retina-images-with-guard-for-cocos2d-iphone-slash-cocos2d-x/以在创建/更新-hd图像时动态生成非高清图像。它使用guard,guard-shell和imagemagick

您可以用@ 2x替换-hd。

答案 6 :(得分:0)

在Mac App Store上试用Resource Helper http://itunes.apple.com/us/app/resourcehelper/id521474600

它的价格是10.49美元,但值得。检查您的图像是否符合Retina(即偶数编号的宽度/高度尺寸)并生成相应的内嵌图像。还可以根据需要处理~ipad和@ 2x~ipad图形的创建。

编辑:我不隶属于资源助手的作者。

答案 7 :(得分:0)

我为我们的应用程序做的是要求我们的设计人员将所有内容导出两倍大小,然后运行一点node script to resize the images(在运行脚本的目录中以@ 2x命名) )。目前,我们只是在每次部署时运行脚本(它是幂等的),但它可以很容易地整合到-w或其他一些文件更改观察库中,如guard

答案 8 :(得分:0)

旧线程,但我找到了@ nschum脚本的用法 - 我注意到,如果@ 1x图像的数字除以奇数,它就不会对数字进行舍入。如果我没记错的话,会引起性能上升;稍微修改它如下。稍微改变awk调用以在那里进行划分并相应地对其进行舍入,并且如果已经存在,则不会重新创建@ 1x图像(您可能想要移除它,不知道)。

此时我们已经达到了非视网膜大不相同的程度(iPad 2仍然存在......?原来的Mini也是如此),所以meh 。把它扔给子孙后代。

#!/bin/bash
# Downsamples all retina ...@2x.png images.

dir=$(pwd)
echo "Downsampling Retina images..."

find "$dir" -name "*@2x.png" | while read image; do
    outfile=$(dirname "$image")/$(basename "$image" @2x.png).png

    if [ "$image" -nt "$outfile" ] && [ ! -f "$outfile" ]; then
        if [[ $(dirname "$image") =~ "Images.xcassets" ]]; then
            echo "Skipping Image XCode Assets directory"
        else
            basename "$outfile"
            width=$(sips -g "pixelWidth" "$image" | awk 'FNR>1 {printf "%.0f\n", $2/2}')
            height=$(sips -g "pixelHeight" "$image" | awk 'FNR>1 {printf "%.0f\n", $2/2}')
            sips -z "$height" "$width" "$image" --out "$outfile"
            test "$outfile" -nt "$image" || exit 1
        fi
    fi
done

echo "Finished downsampling Retina images"