From 3f9857420f9fea0a27a3190cf0079a200460921d Mon Sep 17 00:00:00 2001 From: Hung-Te Lin Date: Fri, 2 Nov 2012 17:49:22 +0800 Subject: [PATCH] newbitmaps: Speed up image conversion by using PIL. Running ImageMagick + PIL is a redundant task; we should let PIL do flatten, resize, and exporting to different format. Before: real 11m54s, user 37m10s. After: real 8m3s, user 16m33s. BRANCH=none BUG=none TEST=make Change-Id: I65f1e5b769161650310abca46851824755402d9b Reviewed-on: https://gerrit.chromium.org/gerrit/37200 Tested-by: Hung-Te Lin Reviewed-by: Bill Richardson Commit-Ready: Hung-Te Lin --- scripts/newbitmaps/images/assets/BadSD.png | Bin 2114 -> 2819 bytes scripts/newbitmaps/images/assets/BadUSB.png | Bin 2842 -> 3640 bytes scripts/newbitmaps/images/build_images | 65 +++----------- scripts/newbitmaps/images/convert_to_bmp3.py | 85 +++++++++++++++++++ 4 files changed, 99 insertions(+), 51 deletions(-) create mode 100755 scripts/newbitmaps/images/convert_to_bmp3.py diff --git a/scripts/newbitmaps/images/assets/BadSD.png b/scripts/newbitmaps/images/assets/BadSD.png index 0dd0e66096d1b92efb8b9a29839705353aae0f16..6e903570cdeba6260f30e10af3a52f987112bc11 100644 GIT binary patch literal 2819 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 literal 2114 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 D+#*$B literal 2842 zcmb7`dpy(oAIE3*)n5S#l34xs=N9JNKkNSf{<*n1u-V?;J~%iC7M-1)Wo2ay z1_P|a!^5Maqru{zC@Cp{dw*^R`~NI<+W(*Wb{H5Kc)r7f2M@sgRaI5R#l`;~^y9}5 zunBr=YwPO{|6bGE+Y3$u`#n89V8LRsYHDhzRBBREQb9pMd3kw7MMY(0CD^3X>Gk#X zjg5`X&CP9XZQ#m|jt=npY&IJ_3pnTH%a`Ekz=*&(91dr6bd1a8PE1Vjc)ZEU$#;CF z-o2Zi;sbhSnh)q%Fy5IN&~vkVK+l6A&&`2enCAof{Q@7*i|_e>URvY>dU=Tt=nu<$ zK(Bn@1N!3%AJCsZ^7*vG>JFcGSleNJZEa(n&&Cd$JAB#UXKY}8Am4WQz5^I4KUL2au=mrsh3c>)PU2r%8Aq;{ zt)G8DU?llM?8Ph8tF)AijLfW@oWha^l?{J2H9vaP(%Sa8=+aoq@x30ByLdKuPw56JP1}b);~Vi4!>7kL9(`!Z^=`1#dZ=Y5N^>;i z*r4$aFmpIAk3mrDQomfVF}}eK>!s$k%DnoxvOm8UmvpxMO}_Xiyi;aw{q1SZ+3l=k zL*4H~Ya6Ybqgm&DH6F*lNI!-NSr!v>mOt~92K>=22y-Wnz>vtlQXv+8Ucy9R75yc} z^zHhz72s0re#n{SYjUe+dYjhRBa8A>4%ECR;Q{js6#6ytG=cXZqAO)Z@_Gp~kGAHs zplacCkra48k{iowsMy6)(Gl5y9;H|P=Lzw)cAcY!hR9(9RGlrRe(`Zfe1Dga9Yjl~ zuAct!^teNUJiXRcll19}5tpvva3S!zOe;)CTJw#6J2uw#)FFV)1n%6Aew2Ei=gx`%ZbC}9%!&}i-3 z0_?3A$qvPU@EHe+8dl3%SJTsCbLDX6ZYjUx?xAP~&44ADE{5AHtq=F|@G$*)duqR> zi@TIu82T%#g{+4rAuZsz)sSo-!&T?`cL%Laex3h=S4jWm&1+%m$ZIDz0R|zNY1y~t z)Q7O`ZWF-$E6|lqHVmXo^>mh6n`wIs0U$(vik+cHi?E!dTtVil5#e~ z{BhBUtKh_RGU|82AnF`3DPf7ibfAEc*ty#Z8&^oFGfuI%Z0h@U>*7~7rfMTSG;Rnr zX9l=ZFU1O&jh&pHU0yDJJDaqua2a=NIU?#R@W$XOMT9}9V&abIHpX)}jg6I|V|q;; zQ5wGFV4vZkhkjCSC09sRWeE~fhZSPm-f2w46%mQDK3LxbnAfG1t^BL)@%2og59)x{ zNFNys;uN~AcBd(}urp81 zMJMW+-9Rw`P=k?K3l(H& ztIAj$oJ&c7b8-eY?>G|&6hqQdae2jMaqxR21%$AF$ZT;1Rgaa%Q+!sFv!qaCiSjmv z`w|v*yRz6X9tNOVVH|lP>Yh5<@?suDz+UG>zHqYmlR%c`3d$Z*>TnZbyicCW{&?tc z7y3Y-I1{Ft`Ywwl5hTs>(Xm2Ak*QG`Y4w;{>lZSj;O1Rvm>w4DW^U@;BY|QptkiXu zVAnuD89Yj#GW-TlTx0|YkZ2;2Yq2{EHRdo1&yq@Z$`$-E+V!o*ufMjn|- z*K-2kD;Su4$Yrj%&h2wT>lS3{?{Y5+Wh@|Qx$c@Di|iYcV!JH$hZQ%2pZkd8O09?q z)WLhC-6=I#eTsQsH!O)}6gBr(zbOUVKo*!M9F*!Eh-`avDC%yOfVj7wC*|=1n6z(# z7LQVTg)8&R=av|XL*FUk0h{8o8yR&W9k%Lwm>5kpIE92L0ovm25Kyc$>obH=B9s`z z|FVvZw=@v+S(2YeVbRxLA7n>Y1B!#?-QUpQGWxgoDRjg!Rzz5$A8CJUkzS_V_xAK7_{d?qn5#&JA;4JmR~SD+|9o?# ze*Ue;nnX2j;=@u0MjsqoGHks5Qq^vzsC%f{vAbILsChr0!BnQhHHLhnzDOM>R<9#2 zET;Ax^s2vO(s9H2910jKg7#pK)->}vu4z{nT+?nPIn?{!B0S1oOx`E{Z3>e|t!TZ| zEHyB*_fyEKuz|M%F*aX>8)7&=@|Bje?*x}KuZDNX(pZcz2`=B47+o0do#lqLloN8R zJup<3Z|w)0N0=s#lM3(GH#HfA-givIjd#J)Vv4O?f*H_kqWhR;2SH$4ND;{2mZN8zd%uj5Wt*xRc5i)Y SDpTSA%e1j{w5T>CQT_|`Qkmrd diff --git a/scripts/newbitmaps/images/build_images b/scripts/newbitmaps/images/build_images index 72147a422a..35f2c813b8 100755 --- a/scripts/newbitmaps/images/build_images +++ b/scripts/newbitmaps/images/build_images @@ -14,54 +14,23 @@ BACKGROUND_IMAGE=Background_white.png # Output file name. BMPBLK_OUTPUT="bmpblock.bin" +SCRIPT_BASE="$(dirname $(readlink -f "$0"))" + die() { echo "ERROR: $*" >&2 exit 1 } convert_to_bmp3() { - local input="$1" - local folder="$2" - local param="$3" - local output="$(basename "$input")" + local folder="$1" + local param="$2" + shift + shift - # Always output as .bmp - output="${output%.*}.bmp" - mkdir -p "$folder" + # convert_to_bmp3.py takes '--scale' while ImageMagic takes '-scale'. + [ -n "$param" ] && param="-$param" - # TODO(hungte) Use PIL to replace ImageMagic. - - # When input has Alpha channel, we need to fill the background properly - # otherwise ImageMagick will fill it with black. The operation (-flatten) is - # so slow so we only want to do that if the input source really has - # transparency. - if [ "$#" -gt 3 ]; then - flatten="$4" - else - # Auto-detect - if [ "$(identify -format "%A" "$input")" = "True" ]; then - flatten="-background $BACKGROUND_COLOR -flatten" - else - flatten="" - fi - fi - - echo "$input -> $folder/$output $flatten" - convert "$input" $flatten \ - -compress none -alpha off -colors 256 \ - $param "BMP3:$folder/$output" - - # ImageMagic quantization may choose arbitrary color depth, even if we assign - # -depth or -colors; so a single-color background may become 1 bit per pixel - # after convertion. To workaround that, we use Python Image Library which - # always generates 8bpp BMP file. - # TODO(hungte) Find a better way to decide if PIL is required. Unfortunately, - # ImageMagic identify "%z" is not always what we're looking for... - local fn="$folder/$output" - # Converting from '1' to 'P' may be not supported by PIL, so converting to - # 'RGB' mode first is required. - local param="convert('RGB').convert('P', dither=None, palette=Image.ADAPTIVE)" - python -c "import Image;Image.open('$fn').$param.save('$fn')" + $SCRIPT_BASE/convert_to_bmp3.py $param --outdir "$folder" "$@" } main() { @@ -163,9 +132,9 @@ main() { # Url.bmp by http://. for X in *.png assets/*.png; do if [ "$X" = "$BACKGROUND_IMAGE" ]; then - convert_to_bmp3 "$X" "$output" "$background_scale_param" + convert_to_bmp3 "$output" "$background_scale_param" "$X" else - convert_to_bmp3 "$X" "$output" "$scale_param" + convert_to_bmp3 "$output" "$scale_param" "$X" fi done @@ -174,9 +143,7 @@ main() { # speed up. echo "Preparing common strings..." base="../strings" - for X in $base/*.png; do - convert_to_bmp3 "$X" "$output" "$scale_param" "" - done + convert_to_bmp3 "$output" "$scale_param" $base/*.png echo "Preparing localized messages... $LOCALES" base="../strings/localized_text" @@ -191,9 +158,7 @@ main() { fi for locale in $LOCALES; do # Prepare all locales. - for X in $base/$locale/*.png; do - convert_to_bmp3 "$X" "$output/locale/$locale" "$scale_param" "" - done + convert_to_bmp3 "$output/locale/$locale" "$scale_param" $base/$locale/*.png done if [ -n "$replace_files" ]; then @@ -210,9 +175,7 @@ main() { echo "Preparing fonts..." base="../strings/font" - for X in $base/*.png; do - convert_to_bmp3 "$X" "$output/font" "$scale_param" "" - done + convert_to_bmp3 "$output/font" "$scale_param" $base/*.png bmpblk_font --outfile "$output/hwid_fonts.bin" "$output"/font/*.bmp # Create YAML file. diff --git a/scripts/newbitmaps/images/convert_to_bmp3.py b/scripts/newbitmaps/images/convert_to_bmp3.py new file mode 100755 index 0000000000..f5afd33d0b --- /dev/null +++ b/scripts/newbitmaps/images/convert_to_bmp3.py @@ -0,0 +1,85 @@ +#!/usr/bin/env python +# Copyright (c) 2012 The Chromium OS Authors. All rights reserved. +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import getopt +import os +import re +import sys + +import Image + + +BACKGROUND_COLOR = (255, 255, 255) +DEFAULT_OUTPUT_EXT = '.bmp' + + +def parse_scale_factor(pattern, original_size): + # Format: w%xh%, or wxh! + factor = re.findall(r'^([0-9]+)%x([0-9]+)%$', pattern) + if factor: + w, h = factor[0] + return (int(int(w) / 100.0 * original_size[0]), + int(int(h) / 100.0 * original_size[1])) + + factor = re.findall(r'^([0-9]+)x([0-9]+)!?$', pattern) + if factor: + return map(int, factor[0]) + + raise Exception('Unknown scaling parameter: %s', pattern) + + +def convert_to_bmp(input_file, scale, outdir, background=BACKGROUND_COLOR): + source = Image.open(input_file) + output_file = os.path.join( + outdir, + os.path.basename(input_file).rpartition('.')[0] + DEFAULT_OUTPUT_EXT) + + # Process alpha channel and transparency. + if source.mode == 'RGBA': + target = Image.new('RGB', source.size, background) + source.load() # required for source.split() + mask = source.split()[-1] + target.paste(source, mask=mask) + elif (source.mode == 'P') and ('transparency' in source.info): + exit('Sorry, PNG with RGBA palette is not supported.') + elif source.mode != 'RGB': + target = source.convert('RGB') + else: + target = source + + # Process scaling + if scale: + new_size = parse_scale_factor(scale, source.size) + target = target.resize(new_size, Image.BICUBIC) + + # Export and downsample color space. + target.convert('P', dither=None, palette=Image.ADAPTIVE).save(output_file) + + +def main(argv): + scale_param = '' + outdir = '' + try: + opts, args = getopt.getopt(argv[1:], '', ('scale=', 'outdir=')) + for key, value in opts: + if key == '--scale': + scale_param = value + elif key == '--outdir': + outdir = value + if len(args) < 1: + raise Exception('need more param') + except: + exit('Usage: ' + argv[0] + + ' [--scale WxH!|--scale W%xH%] [--outdir DIR] files(s)...') + + if outdir and not os.path.isdir(outdir): + os.makedirs(outdir) + + for source_file in args: + convert_to_bmp(source_file, scale_param, outdir) + + +if __name__ == '__main__': + main(sys.argv)