diff --git a/bob/io/image/cpp/pnmio.cpp b/bob/io/image/cpp/pnmio.cpp
index 0b43defdd23b626c11ecc9dbc18b3669939976ec..6b55ab7b1b967ad670f2258789c75ccd664f8769 100644
--- a/bob/io/image/cpp/pnmio.cpp
+++ b/bob/io/image/cpp/pnmio.cpp
@@ -34,6 +34,25 @@
 #define  RGB_TYPE           1 /* used for PFM */
 
 
+/* line_start
+ * Tells if a line should be ignored (completely empty or contains a comment)
+ * Returns: non-null if we should start reading from that position.
+ */
+static char* line_start (char* line) {
+  char* start = line;
+  int size = strnlen(line, MAXLINE);
+  for (int i = 0; i < size; ++i, ++start) {
+    if (isspace(*start)) continue;
+    if (isgraph(*start)) {
+      if ((*start) == '#') start = NULL;
+      break;
+    }
+  }
+  if (start == (line+size)) start = NULL; /* end-of-line ignore it */
+  return start;
+}
+
+
 /* get_pnm_type:
  * Read the header contents of a PBM/PGM/PPM/PFM file up to the point of
  * extracting its type. Valid types for a PNM image are as follows:
@@ -51,26 +70,16 @@
  */
 int get_pnm_type(FILE *f)
 {
-  int flag=0;
   int pnm_type=0;
-  unsigned int i;
   char magic[MAXLINE];
   char line[MAXLINE];
 
   /* Read the PNM/PFM file header. */
   while (fgets(line, MAXLINE, f) != NULL) {
-    flag = 0;
-    for (i = 0; i < strlen(line); i++) {
-      if (isgraph(line[i])) {
-        if ((line[i] == '#') && (flag == 0)) {
-          flag = 1;
-        }
-      }
-    }
-    if (flag == 0) {
-      sscanf(line, "%s", magic);
-      break;
-    }
+    char* start = line_start(line);
+    if (!start) continue;  /* skip this line */
+    sscanf(line, "%s", magic);
+    break;
   }
 
   /* NOTE: This part can be written more succinctly, however,
@@ -101,6 +110,7 @@ int get_pnm_type(FILE *f)
   return (pnm_type);
 }
 
+
 /* read_pbm_header:
  * Read the header contents of a PBM (Portable Binary Map) file.
  * An ASCII PBM image file follows the format:
@@ -114,35 +124,23 @@ int get_pnm_type(FILE *f)
  */
 int read_pbm_header(FILE *f, int *img_xdim, int *img_ydim, int *is_ascii)
 {
-  int flag=0;
   int x_val, y_val;
-  unsigned int i;
   char magic[MAXLINE];
   char line[MAXLINE];
   int count=0;
 
   /* Read the PBM file header. */
   while (fgets(line, MAXLINE, f) != NULL) {
-    flag = 0;
-    for (i = 0; i < strlen(line); i++) {
-      if (isgraph(line[i])) {
-        if ((line[i] == '#') && (flag == 0)) {
-          flag = 1;
-        }
-      }
-    }
-    if (flag == 0) {
-      if (count == 0) {
-        count += sscanf(line, "%s %d %d", magic, &x_val, &y_val);
-      } else if (count == 1) {
-        count += sscanf(line, "%d %d", &x_val, &y_val);
-      } else if (count == 2) {
-        count += sscanf(line, "%d", &y_val);
-      }
-    }
-    if (count == 3) {
-      break;
+    char* start = line_start(line);
+    if (!start) continue;  /* skip this line */
+    if (count == 0) {
+      count += sscanf(start, "%s %d %d", magic, &x_val, &y_val);
+    } else if (count == 1) {
+      count += sscanf(start, "%d %d", &x_val, &y_val);
+    } else if (count == 2) {
+      count += sscanf(start, "%d", &y_val);
     }
+    if (count == 3) break;
   }
 
   if (strcmp(magic, "P1") == 0) {
@@ -176,37 +174,26 @@ int read_pbm_header(FILE *f, int *img_xdim, int *img_ydim, int *is_ascii)
  */
 int read_pgm_header(FILE *f, int *img_xdim, int *img_ydim, int *img_colors, int *is_ascii)
 {
-  int flag=0;
   int x_val, y_val, maxcolors_val;
-  unsigned int i;
   char magic[MAXLINE];
   char line[MAXLINE];
   int count=0;
 
   /* Read the PGM file header. */
   while (fgets(line, MAXLINE, f) != NULL) {
-    flag = 0;
-    for (i = 0; i < strlen(line); i++) {
-      if (isgraph(line[i]) && (flag == 0)) {
-        if ((line[i] == '#') && (flag == 0)) {
-          flag = 1;
-        }
-      }
-    }
-    if (flag == 0) {
-      if (count == 0) {
-        count += sscanf(line, "%s %d %d %d", magic, &x_val, &y_val, &maxcolors_val);
-      } else if (count == 1) {
-        count += sscanf(line, "%d %d %d", &x_val, &y_val, &maxcolors_val);
-      } else if (count == 2) {
-        count += sscanf(line, "%d %d", &y_val, &maxcolors_val);
-      } else if (count == 3) {
-        count += sscanf(line, "%d", &maxcolors_val);
-      }
-    }
-    if (count == 4) {
-      break;
+    char* start = line_start(line);
+    if (!start) continue;  /* skip this line */
+    if (count == 0) {
+      count += sscanf(start, "%s %d %d %d", magic, &x_val, &y_val,
+          &maxcolors_val);
+    } else if (count == 1) {
+      count += sscanf(start, "%d %d %d", &x_val, &y_val, &maxcolors_val);
+    } else if (count == 2) {
+      count += sscanf(start, "%d %d", &y_val, &maxcolors_val);
+    } else if (count == 3) {
+      count += sscanf(start, "%d", &maxcolors_val);
     }
+    if (count == 4) break;
   }
 
   if (strcmp(magic, "P2") == 0) {
@@ -241,37 +228,26 @@ int read_pgm_header(FILE *f, int *img_xdim, int *img_ydim, int *img_colors, int
  */
 int read_ppm_header(FILE *f, int *img_xdim, int *img_ydim, int *img_colors, int *is_ascii)
 {
-  int flag=0;
   int x_val, y_val, maxcolors_val;
-  unsigned int i;
   char magic[MAXLINE];
   char line[MAXLINE];
   int count=0;
 
   /* Read the PPM file header. */
   while (fgets(line, MAXLINE, f) != NULL) {
-    flag = 0;
-    for (i = 0; i < strlen(line); i++) {
-      if (isgraph(line[i]) && (flag == 0)) {
-        if ((line[i] == '#') && (flag == 0)) {
-          flag = 1;
-        }
-      }
-    }
-    if (flag == 0) {
-      if (count == 0) {
-        count += sscanf(line, "%s %d %d %d", magic, &x_val, &y_val, &maxcolors_val);
-      } else if (count == 1) {
-        count += sscanf(line, "%d %d %d", &x_val, &y_val, &maxcolors_val);
-      } else if (count == 2) {
-        count += sscanf(line, "%d %d", &y_val, &maxcolors_val);
-      } else if (count == 3) {
-        count += sscanf(line, "%d", &maxcolors_val);
-      }
-    }
-    if (count == 4) {
-      break;
+    char* start = line_start(line);
+    if (!start) continue;  /* skip this line */
+    if (count == 0) {
+      count += sscanf(start, "%s %d %d %d", magic, &x_val, &y_val,
+          &maxcolors_val);
+    } else if (count == 1) {
+      count += sscanf(start, "%d %d %d", &x_val, &y_val, &maxcolors_val);
+    } else if (count == 2) {
+      count += sscanf(start, "%d %d", &y_val, &maxcolors_val);
+    } else if (count == 3) {
+      count += sscanf(start, "%d", &maxcolors_val);
     }
+    if (count == 4) break;
   }
 
   if (strcmp(magic, "P3") == 0) {
@@ -433,7 +409,7 @@ int write_pbm_file(FILE *f, int *img_out,
   fprintf(f, "%d %d\n", x_scaled_size, y_scaled_size);
 
   /* Write the image data. */
-  for (i = 0; i < y_scaled_size; i++) {
+  for (i = 0; i < y_scaled_size; ++i) {
     for (j = 0; j < x_scaled_size; j+=step) {
 	    if (is_ascii == 1) {
         fprintf(f, "%d ", img_out[i*x_scaled_size+j]);
@@ -485,8 +461,8 @@ int write_pgm_file(FILE *f, int *img_out,
   fprintf(f, "%d\n", img_colors);
 
   /* Write the image data. */
-  for (i = 0; i < y_scaled_size; i++) {
-    for (j = 0; j < x_scaled_size; j++) {
+  for (i = 0; i < y_scaled_size; ++i) {
+    for (j = 0; j < x_scaled_size; ++j) {
       if (is_ascii == 1) {
         fprintf(f, "%d ", img_out[i*x_scaled_size+j]);
         if (((i*x_scaled_size+j) % linevals) == (linevals-1)) {
@@ -531,8 +507,8 @@ int write_ppm_file(FILE *f, int *img_out,
   fprintf(f, "%d\n", img_colors);
 
   /* Write the image data. */
-  for (i = 0; i < y_scaled_size; i++) {
-    for (j = 0; j < x_scaled_size; j++) {
+  for (i = 0; i < y_scaled_size; ++i) {
+    for (j = 0; j < x_scaled_size; ++j) {
       if (is_ascii == 1) {
         fprintf(f, "%d %d %d ",
           img_out[3*(i*x_scaled_size+j)+0],
diff --git a/bob/io/image/data/test_spaces.pgm b/bob/io/image/data/test_spaces.pgm
new file mode 100644
index 0000000000000000000000000000000000000000..e1d116b5e620659222a461abf0a1f139db853242
--- /dev/null
+++ b/bob/io/image/data/test_spaces.pgm
@@ -0,0 +1,6 @@
+P5
+# CREATOR: GIMP PNM Filter Version 1.1
+
+100 100
+255
+[\[YXY\[^^]`]aaa`d_`ba_b`aad`ddage€唈hilpkjsuqnkqquypmstqrk{wrtxuxttvvww{{zxz{{w{|}}�€€~�剟儎儍俋YYYZ[^_]\_[\^^]\baabb^bbfg`aggiii}瑏ooitt}弜~tq|xq乴pozupt妔tzuu{uywxzyzxz}zz{{zz€}亅~€倎倎�剛剟X\Z]_[][\^__^^_`__a]f_ca_``\bee`dhw焬pp~僰妴op�墇w~wpu|倉vvwvwwvx|wy{{}y}|z~}}€}亖~}亗剝剘剟厖匶Z[[\]][\]]\_]^```bc`_acbaaccbadwr{x噳rx~|uy唲~坾z悺梱qs|ux峿{yyy~vuxux{wy}zz{z{}}�}~€€€儉厖儉剠厖WZ\\[[Z_aZ^]^_a^]]_``a_cbccdcbfn`mvw|ggdgo{y恛t€墐崠殞uw{v剼啂{~x妚{yxzy}x||{{z}~�~~|個倊儍剚倎剠Z]]X^`^\^]`_``a_`a_^cbbbbhaeabhlninoTAE>;_]lok^gtm専拕y亱拫枖寚妬vwzywxyz{zxwy~{|}y}�~亙亐亣儉儏塤[[[]]\```]]`a_]cbaa_`ccabdfbhlvxuqUA:9/36=CMRX_|wo~噭儉^`卻u{w彑�~坺zxz{|y{{||}}~~|亗~亖剙們剛儎XZ[\_]]``a[]_^\__`Zdaa__eddbdabfxv\;6@ADB:2<D@J\d厏僴o€p}�悤毆Ц珮}剗}}xyyxz|儉{}{|~~亙亗儊倕儏厛倖^\[Y\\Z\\^^^`^^^^^b^baacccegbfqil[D;EA:S@PLNMOakXlrxlmvtlQa亜zy唩悾殑倝脣zyxy|z{{|倈~€亅}}們們儌X\\][^]]Z^]\``_`_aab`abbcaefdheqYSE:NF28:;:GIKLGlfY`lo]MM>eoexi儏仏翙帿榾儈y{||{~{||倉€€亗~倓€厒剟哴`]Z\\`^^^]b_^a`aa]b`aaab`bccem^FJL?K4:QPdA;E[J@UJKWNehN]\Vgkns厱毩诓櫄搱媧|{}z~||}}~個~€厒倐剠僘Y^]^]\a`^_a^````^d_acbbfabdbfcYZ;9MKEPXu~f?]?YQl^G^>4>LK>QWSfjlz悷ń脯连€zzz|~亅亅}亐倉€們儌儊乗][][\\a\_`\^[a^_b`b^bdabbg`gbWRHE<>RQ_rr憤rB<PfTQcNE=8=7:?SCPkbki倷でΧ骏€z|}}{~{€~~€倎儈厑€倐]]^\[_^\_Z]_adac]`bc_c`hfbefgdROI;A7NN\hs姀哢K_UIKc@640-060<Vethgg{挰那话量坽xx}z€|z~個~}個倈剠僛\\]]\Z^_^_^__a`\aa``^d`ddfggUAFZLI57LALkz{q^XhlbD:D7/5(3)-?<>YDa_qw摡热塘燃搮y|{|~€||€亖~倓亊倎匼Y[\[Y`c_]\\_b^^]a``cccdgebg_I?CTZJG87B=Ubig^U\GO^P525F)/9::1B?^VhHgz樆呵屏覞儈}{{{||�~€��剙亗Z\\\^b^\]a`b`da_a^_`bbebcbda^n_LMRLC<2+<MPXIDL@L`XV..8+0+I1"!9E33nuNWt啰可油�厖}z}{€亅~}�厎厔儊剠哷\_^_\^]\Zcb`__`]`[j\bbadbg^VPZWHA<F;;/8>M@H;=BGF&6<>4**>(%35,87U嘰SRf€熚仙箞啳儂z~}亊€儉~€儏儐亜[\ZaaZ^a^c^cdc`b_bbedecdee`IJ@CC@FNE?94*%7D4;59B4.+$2 %2?,.86239=6EZhk亪镣微媩翇}}~}}亅€個€儌厗唫^\\a\[`^][b__bad[ad``geedgZFLNID@:?27601 09/NENCUWA=;(%%&8)6+),:0.?\DSfr灧谛粦敜�|{|{|~|亊倎亖亙俔WZ]b`]]aa_ba`c_cbbdb_edf`IRHXD878.14($&0$./LIYOPVk_?/ 3C/"0/:<94Yea`ax櫞少菓┄盀{}}z�}~{€}~~亙�][[Z^]]]]^_b\c_aa_d^_cffgUPPT=3/85-'#40)46411YVi^j{乻+(,334(252::Db檝p|~槶赁貦航毛焴亽噞|€亙唫€亐€僝]\]^^`_ab`^`]`c__eebbdg`VHK323812/&%*975.+309AFVTX;=P05+'8-618CNCx~a亼垍霉懌胀噲�|}~亖€亗z剝厐\[`_`_Y[Z\_a\`_a^cbjdf`cGLF@/129*10-**,363CG+/;177+"12%91%*99407kuf~弚~swォ毝⒐现'悎€亇}|~倎€亙\^\]\^__b`__```dac`eadcRILB87398:*$/&(,1+/;5."2;/$%#5)-->( 306<6W昳vIRWjwl{倠灟米邯泴儌}€~€~倎厑\]]]]]_]`^b`_b_a]bc_c\PHCE:;.3,=4)/.,&!(5=BL4)+'0%$#+,.5@(8/75KGMaX\oY_JSl拻静潻菅懂泤~}亅€€~亖€乊\]_`^a[^a^\c^]c`afc_VHGH@A843=:,0*+&,.0&?J7;7)+.*,#/+3><66177?V^僼@Ll凧RIX`x嚶停化|€儈€€~亖倐\\Z[]a_[^]cb`abdaace`ME2E<?5<<;6:/2/*1440::G;7+$)3*)*+=580F:;ATV僝]g=<UBDDG^~棭禑〃飘迫殤}~€~儉亊~乚]^]``]^]`ca^b]ab_d^ZQ0-B57/<0A?==9@F88;@?;/(.+710/1-4@9;HC?EDUR_hh@18AJGXZpq劅靠灉碀劣枔倐~倎€}亖亐\_\_][^\a\[acb_bccaaP2&0=55C5<>9<I<.4;H:25,&&14,172.0J437%8?LU_MYyV5;7@XbL[viyɡ涣睅牬綈倐€}€亖€€€\`]^b^]_aa^_a^abdb_\V8:7101@35G:P>*:A=40.9%./<95750-9DAN4/<>0LeVCPS`P,J`lnqSTw槜��亗{}}~~^]^_a]]cbb__]\^^`aa[QN9>&&,0,3IHL:/%-159345;5>B773.6IC4<=O246+_jFQPQfKZx弒jj悎Ιキ櫐拑坾�~~~€刞]`bc]\^b`bbab^bea`VHH/1H%4,09?C<.2-26<8;""<GX>@;7<M?8>F78A>4:h?DMVNI^儓巿n剟挰幍Λ拹垁~~~|亊~乕]^`a]^`aaa`bb_bb[ZKEK@+A61'*HFI2)7HE@>:,/*4DF:A=<7;K:DXhM?<<<3=B4?HRLRf}~唞x摐嚁2僚磱墋{}~z}倈亖~]\Z]aab``d_aa`]b^QM>=TG-@>/&4IBZ28;;FQ:'202HH>CIIB>7F@>DZtsaDK7_kC<D<TQ`kx湌儕殗椒允搨噦€}|唫€儌\Y[^]`^`\_^bbb`a[C>F3O>7=92<7CKN7=;F?:=?:JF=FGCMNG?7L9FBRUmpry~tfGJKs棌噸晪d櫏墥匦剗z}儅|€倈倐^^^__b`]a_bdbceb`O@7.H;;@6;@G>PN-*+/8+$ -4DNQWSQLKD9M4EKTUYjrx俽oo灖_UU~▁揷i嫏搒⒊雷瞻�~}倊}}~€�~[^]^`[[aacbc`bcbcO@4?;81=>,6O=JH6*-)4#'1FP\^caWSLRH9B4R_[W^[]}亅坣y粰IYpw槙r]t`~闯乃馗�}}~{{}}~€]a_^a_a```_^c_bf`AAK246$=4'.S>EI5-4+8-9GUiqmkgZWTPU?EJXZ_f_YHSGPl€ダlDg|瓝~ajvTi环人盛悀~�||€~{€`^````b^_bdbb`bh`OMN263)0/''B24@D.-26@LZanqprkYVUW_HIRXQiaefWHNOihl亾€R]劜檚uiJG\灚此茪儎z亅}|}|€€`^a^a^cb_]`c\_cfTVYT:@5%(6+340IN23;:GWahrovqo^S_]dNAJ]dijkkcL_S_\CYv垎m姫af7Sg啨┬袧|倓億x亃|{亇][`^]^c__aaccbbeNWV;[M5%$(0052?R67GCDQ\lqqosq\Y\ccSNGUfbowocRN[eGY|划}梹檳xR[<.mkと拥儅}}|zy|俔a^_`]_^_c`cccdcH\RI=;4'+)-%:,78>=KUKNbioos|sfg[ec^cQTWncmzYjpinXX挒~n籾kYEO+wo澬椅泒亇厏€}}z€~`a`\a]c_`__aae`YMRE;=7?2-!,4:,&4JTJRTRVlvzw{ymkadoi_dY]asugTc_qkqI\噟VVt`B:F:^s嵭俾亙~~~€~~倉€_aa_d__]_dbd`ceY@>D8:==10/%17% :9OTSVgkqy{y亐qs€w\t`pq`\ZQVQkebjx歨NTZhpsGF79AT@u嬕驯泋|x|�||}亖``_^dbf^aaibdca^6@?9QC"\tE 1;ELS_ijplry€亁z倉uhcw唝JY_RVTss悤福eU{qtS?88GTE_勓学泒}y€|||}}||}]^_]b]_]^_b^cbejG9=@7!%
)ZbiN?6&<?FFMhwvro~|}亝噥垈y|帞峾_Qpslop偂刭仪�P:;9UbJS~日zz|y|}~|~z}`^_^^``_`caaQPZVL52/$!,!#GOxsm`^P4?JRUQScvtyxz亪厓増亂€|姁zW_u挔母鬯郛乗-:PMHXbo口晊~{yz}}|~~z~^a`a_aacbbbefQ:31--&))4' >qcJZdUJW^J^ic_[TR_kf}儔媼憫帋pon^K[b姅練猎抟菙jQB4;\cWa略搥|{{{}{{}z{~|}```_]`ffbbccefUB7-/8B>1%<媩iw{厑厏nZy倉zhjc`_o剗崝洐槣弝smz垏l|Σ从蒽槿笌\:70:QaQW可搚{{||{}{{z}|}`]_^^aanle``]_d]OFWKI;!"$V漹Wh垇€~|€x~}}ylnnpucv€寬潫湡殟tmhgcvxp嚦剽扈郎玬QK/;QfSi礁坾yz|||y}{|}||^]\_a`]adeeeebac]_YZJ(7X灇b厗€亖儏~唸墕墍{}€wm~彂摐ěsl垊儕櫉苟糜徵茟YT.DKiL渵z{yyxz~}y|}]^_^_`aaabb]bbc`d_`K1(@Yw弫€噵帊媮唻妽僽hivru噹棨硁寬倕彊潵驳觅茑研呓苭oF6BNc^t獢x€v{yyy{{}}{y}\\\aaaa_]ab`da`dcabK* .>dv厎~€ztlnhkfZgnlZPuvy崡祍儉€墕剢憶Ф阶蓐蔬咄~繍D8GM_i€箶|僽xzzxzz~xwxv[_]_^^_\^b``cbaa`b^?0@Akw亁vfn垏媦{usiSWMPlynq儠敿亀fbdo{悥Гぐ罔谱骅�9@AQic儻坾xz{u{wzzu{z{}x][\b__^_^]a_cbddfcb;&<L8ks倇zx[Tml[XVONEU]Y`dw€懍瑑墄ils{対承爿余糜缛崠�1F@Ws|w泩xwyy{uu{{~xxys|^]^]aa]`]a^\dddecdi63JiBg煏y悐姂heQ<6;HIKPUhh}po剸狼搝d^RG=HWl腙坜赅舝�8OIm}妦巠yxxvww~yuxxxzxx`[___b^a_cab``abddn@(<^n6^枟{殬棑唻wWPX^X]dagdrFn剚囆潖xfelmsx嚙这轶扉鹑蟏LU悢拻卻uvwuuxvz{x{wyvy\][[Z\_]_`^^_d^c`acK6CPc?n敎~湝晽拲強倇亊{qio亐N_姌啪渵儖厛厭ǔ哇骘蠼蟄梼Tl晬儀vwvuvutwtwtzywy]\\\\_`[^^\``^`d`bkV=7NAAr垶垙櫀槢棝潨煔拪垚wBx毇揣緷啅—课攒屣絒憠S壌激~zwytvxwxvwywyxxvv`]^]^[^^^^_`ac^b^biMB??23儅潨z牊櫂槢湝殮槗寜拠J[墳乾猷牟ゥ宦现茆铤鹰t崓V捈某倆uvuvwuzxqrwvwvx{_]_[__`_^[_b__abbbi`LBA:.tv櫅€櫅灑槨牐潣棇悡妀Ms摑侄怃倨挤冀磕沃噼覃蹝l巣X嵞赢峾vusuxzwyyyswyuwx[]]]]_^_c``^a^_`bdagI>BH4hb憳巿棖湡潯ⅳ洑棗搟Jq垜¨兽爬垅痔腹涣男劂珧貅灵}m儔S锻榯wuwvuuwvtyyuwvuw[[[\^Z[_aa_ba^a_bd_deJHV7i厛晽唨寴洘潧牆湙拕Vh亞挌λ玮涚蒇陨览钠沿徨秕魍詘pz漇烧女vwwtsvwsvtwuuvwy[\[_]^_^a^_^`^`c`bdccWPJ=jav枒憒uz墧潧枏弲w`ey噽槤漕仕巅质胶靠艘阝祗苠畝u嬔Z讶停墌uxwuutuusvtutzuwY]^\_^][aab`eac`[_debh\K7Tmw摂媺|oqnqvspi__oz{亷枩屣狭逶釉冉杭角者珑央潌槰觀暭拀wqrwxvsrruvxxwxuZ[_Z]][\\]]^^]`\cbachd`Z=KZs敁寖~wxohvtrtx亅rms崟櫒夸蚩|涏忍闪蓟娜暂阖钽獪臺叄巸攜xqutsorrsrrtptvr\^[[ZZb]]^^`_bab^_]`ad_^MNGE彇崒唫�儑噸垑儁Wfq挄槯寇鹦|q|忌酒妊脏嶂骤蜞食糯墬焮}yrusrossssruusouwvxXXX]]^]``\^^bc`_bb_`bab^XA@=敄崕亜媶姂憣彂唓Ir}摂槫沮镤╪厑仯殶恍弪螋缟琭|rnrnonlrnsosqtrvpsvuZUa^[Y`_]]_]c\bacb_cc`ba_-83厳晪媱妶墡憥媻~dQ{厯帡α茯暌f|帞灐Ч帚眈赧镤考茎P恡wqsrnpnmqorutrrqquvyu_][][W^_\^[b_a^][_`]bb_\Y,B/q槢妸厔{噮妺亰~bR€厡悺慧痖謍t崜灘参帚铙簌枙璵峵rmlorvponoonsntorsvsqtYZ]]Y\[]\\a__]^[`^daac_SI,F?U晼弻噯儓垔妺噖k]nkjv墝ね撸粈~嫈湚菏卒痿貔hm▅}pqonopmqprsqprptpqrsqqnYY\[_]]^\^]\_[^`a[^__b__UZ0\6棓晪噣~唥剢倉zt[YHhou脻}帢憣櫂〔售屙貅骯哤弰oppnnmlnoquoqqprssqsqtx]\\_^Y_\^[\a\^a`]^___^`_ag)`4晼棇�|}剦噭~yvsbb_m嚐盃灛敃潳馘祺hgowrklmootornpopqpnotsqpsqrX]Z\\][[\X\\^_]\_a_a]d_`bbEWIs敃弴噥z唴儊{|w{v|啺蔷饭洖ⅳ阱铞鵀Srmmnlollnomprspnqrurqrqrso\Y[\YZ\Z^\]]\^]__^[[[ac``]_.[C憪帀厊zx們�噣€剠儕寴士蓝Жウǒ秦骘~ZtknkmllnolqmppqronsrqppoppuVX\Y[[UV\_\^b[]\^a^]_^``abd6^T悙巿厒uy}�垐儉儑嚀櫆智新抄蜜玺ljnmllmqnnomlnpmnomqprtqpporp]Y[[Y[^][[Y][]_Y[\]]^^^_\\`\&gl姀崐倊xux~噮~亙妵悶敚孔疫装辑怵貔礛omkhmljpnnoloonnpopqmnpnqmomXWWZW[Z\_Y\][`YZ\[]c]^^_c^cbL8剬帀妰yvy{�}倖唻櫃敐晃葭阄苛证ㄉ骟鼹鼬Grlimjkjhihljjlllnooppqopmmpos[YXWX\X[ZZ\\\[\\\]]]\``__c_bd(l寪寚厐€~噷悙懄牼眼觌闼唐露翔豉鏻\qkehigkkjklinlmmpoompplpnspmV[W[XYZ[\][[X]X]]Z]Z^]^]c_cb$噹媿妧€倊~t僺][_o噾噧墰能缟胎掠陂豉揇k俽hkhkhkmjnlmommromnolminqsuX[YXYY\Y\\[^\[]W^][a\\_`cbS&"a唶媻亗倈om[UN:))<HE@,3Ks煠攺沧忪貅Z<崉hlffijhmijknnlhkknplmlkmmnmZZW\Y\[W\YX[^]`[^]a^]`c]cB$!)亜唺剟厒mkhNOLB-'.)1>Q櫶塾◤ね潢篥R5u俈YspiiikhlllklmklknlllkkknmYW[`Z[YVX^\^ZX\Z]ZZZ][[eA!"#
"2d儌唸}yojlpfj[GMJDBBtハ滔當樎怆篦虔 X]rNPa7_mpmjfhomplpnlhkkmlillkV[WXXZ]_[V[[[YZ^Y]\\__a=$#  !3R{€}yxzumnppnkmdiejfd姤崃兔珰珙蜿6inWeATgNBCOkjljjiknkojoonqmmkkoVXZZYWXTY[YZ\]^[Z\Z[bK,.<Wm}zwvwvswsmbhbjsvlgz幠妥溪ㄐ骓驇+)Mg_>OYgFG?GdomjhjkimkhqllgmlolXZZWWV]ZXZ\ZZZ[[\aa`6(!"+;Sdouxstqnyxonhjmo儊嚃簺煼乌嗾剐衢逨**J\2MXgOHADCMgmjikjjllmkmkjmmmWXW\XYZZYZ\\Z[\\[^G' "/:Qaqqnrtxw|zvsniiqs}~唨垜λ噤茉受铇B'%-JT2AZZEJIBC>>HcijijhiigjkjlmjYWZV[ZZWZ[YX[\Z^T4!):VZgrkiov}亜€}zokms~墮殦嚯廒艳蠎; (Ea/=NSL?BDC?A?DRdkmhmokkkkjilWYVWYZWYWXZY\`Z=&!+;:[]ormgou倉亖亇{w~厠帪灅漕阄浙習</I]1@FER9=FA>:@B@JYljeikkkjhjiUWV]XZZ\ZYZ\_E'!!-=6TXlkmunqy~噮y€z}噷彎ī犝骒勐邋痽5! *>^7<?7N79=?>>;;;>BPjrmjiihkkjXWUW]XZZXX`B*""(:5MZgimoktqz€唹們剫垔尀…ψ玷捂碹檇) !+C_6::7I16898:73:8;BHexrllnhieXVSZX[Y_YE' %#&2:LSbehoojmwx|僿儎唸崑枴阪籴忾蠂Q! #,JT4645C-2857316/273<IcoipphjfWVXW[^]@.& 
 3G>W]addhmkjru{{{倎噸嚇├葑堰噫竫P&"&.PV0730<+334210//03377?Xz`OdkkTWYXY4**!7C<QXfe``gihokosv{rqx剛尌我酚走砖cE.LT1.3.6.12//.+0.,.2/69;QgsdZkVY\>,.#  7D=LU[kb[hgcmncimpkho|vp樕秘薷塏>%#2XT,,,42,*/-(+,,),/-3128>PWhyaXT4(#!2ABMRTcd_[_hfommjd_]gt尨婊‖瀑茽iA4"(6ZJ0*(-0+,(,0&)/))+*+++68?IUftP.*!  
4AF>YR]fjcb_dkqt倊zux懙谵ㄌ赢揢<)!&7\D0),/0.*+')*+%+(()(')/08=KXd+"  !(AG;JTYfmlfc_am~亁mry}犝爷┐魏O9';Y<+(/070*+%')++)%'(((**05=AKZ"# !>DF@TY^gnmhjefjxww{}災喇井榯K<  ,?O6)$+..1'')*&)'(''&'$'&,/9;AK
diff --git a/bob/io/image/test.py b/bob/io/image/test.py
index b86b27a34d7cb4472d4041415015215a339c9bd8..663abfdd0f0050a4c3ea8a6714a7306603875497 100644
--- a/bob/io/image/test.py
+++ b/bob/io/image/test.py
@@ -101,6 +101,7 @@ def test_netpbm():
   transcode(test_utils.datafile('test.ppm', __name__))  # indexed, works fine
   transcode(test_utils.datafile('test_2.pgm', __name__))  # indexed, works fine
   transcode(test_utils.datafile('test_2.ppm', __name__))  # indexed, works fine
+  transcode(test_utils.datafile('test_spaces.pgm', __name__))  # indexed, works fine
   # transcode(test_utils.datafile('test.jpg', __name__)) #does not work
   # because of re-compression
 
@@ -112,8 +113,8 @@ def notest_gif():
 def test_image_load():
   # test that the generic bob.io.image.load function works as expected
   for filename in ('test.jpg', 'cmyk.jpg', 'test.pbm', 'test_corrupted.pbm',
-      'test.pgm', 'test_corrupted.pgm', 'test.ppm', 'test_corrupted.ppm',
-      'img_rgba_color.png', 'test.gif'):
+      'test.pgm', 'test_corrupted.pgm', 'test_spaces.pgm', 'test.ppm',
+      'test_corrupted.ppm', 'img_rgba_color.png', 'test.gif'):
     full_file = test_utils.datafile(filename, __name__)
     # load with just image name
     i1 = bob.io.image.load(full_file)