diff --git a/src/modules/Image/encodings/png.c b/src/modules/Image/encodings/png.c
index 3e2dcb54f7f0baa39c6a04d53650b50c8a28998e..55926483f2c3593a2630a4e11f1e13d718a1e0ea 100644
--- a/src/modules/Image/encodings/png.c
+++ b/src/modules/Image/encodings/png.c
@@ -1243,7 +1243,7 @@ static void img_png_decode(INT32 args, int mode)
 	 /* ------ major chunks ------------ */
          case 0x49484452: /* IHDR */
 	    /* header info */
-	    if (b->item[1].u.string->len!=13)
+	    if (len!=13)
 	       PIKE_ERROR("Image.PNG._decode",
 			  "Illegal header (IHDR chunk).\n", sp, args);
 
@@ -1304,7 +1304,7 @@ static void img_png_decode(INT32 args, int mode)
 	  {
 	    int i;
             if(mode==MODE_IMAGE_ONLY) break;
-	    if(b->item[1].u.string->len!=32) break;
+	    if(len!=32) break;
 	    for(i=0; i<32; i+=4)
 	      push_float((float)int_from_32bit((unsigned char*)b->
                                         item[1].u.string->str+i)/100000.0);
@@ -1333,7 +1333,7 @@ static void img_png_decode(INT32 args, int mode)
 
           case 0x67414d41: /* gAMA */
             if(mode==MODE_IMAGE_ONLY) break;
-	    if(b->item[1].u.string->len!=4) break;
+	    if(len!=4) break;
 	    push_constant_text("gamma");
 	    push_float((float)int_from_32bit((unsigned char*)b->
                                       item[1].u.string->str)/100000.0);
@@ -1343,12 +1343,10 @@ static void img_png_decode(INT32 args, int mode)
 
           case 0x70485973: /* pHYs */
             if(mode==MODE_IMAGE_ONLY) break;
-	    if(b->item[1].u.string->len!=9) break;
-	    push_int(b->item[1].u.string->str[8]);
-	    push_int(int_from_32bit((unsigned char*)b->
-                                    item[1].u.string->str));
-	    push_int(int_from_32bit((unsigned char*)b->
-                                    item[1].u.string->str+4));
+	    if(len!=9) break;
+	    push_int(data[8]);
+	    push_int(int_from_32bit(data));
+	    push_int(int_from_32bit(data+4));
 	    f_aggregate(3);
 	    push_constant_text("physical");
 	    mapping_insert(m,sp-1,sp-2);
@@ -1357,12 +1355,10 @@ static void img_png_decode(INT32 args, int mode)
 
           case 0x6f464673: /* oFFs */
             if(mode==MODE_IMAGE_ONLY) break;
-	    if(b->item[1].u.string->len!=9) break;
-	    push_int(b->item[1].u.string->str[8]);
-	    push_int(int_from_32bit((unsigned char*)b->
-                                    item[1].u.string->str));
-	    push_int(int_from_32bit((unsigned char*)b->
-                                    item[1].u.string->str+4));
+	    if(len!=9) break;
+	    push_int(data[8]);
+	    push_int(int_from_32bit(data));
+	    push_int(int_from_32bit(data+4));
 	    f_aggregate(3);
 	    push_constant_text("offset");
 	    mapping_insert(m,sp-1,sp-2);
@@ -1371,13 +1367,13 @@ static void img_png_decode(INT32 args, int mode)
 
           case 0x74494d45: /* tIME */
             if(mode==MODE_IMAGE_ONLY) break;
-	    if(b->item[1].u.string->len!=7) break;
-	    push_int(int_from_16bit(b->item[1].u.string->str));
-	    push_int(b->item[1].u.string->str[2]);
-	    push_int(b->item[1].u.string->str[3]);
-	    push_int(b->item[1].u.string->str[4]);
-	    push_int(b->item[1].u.string->str[5]);
-	    push_int(b->item[1].u.string->str[6]);
+	    if(len!=7) break;
+	    push_int(int_from_16bit(data));
+	    push_int(data[2]);
+	    push_int(data[3]);
+	    push_int(data[4]);
+	    push_int(data[5]);
+	    push_int(data[6]);
 	    f_aggregate(6);
 	    push_constant_text("time");
 	    mapping_insert(m,sp-1,sp-2);
@@ -1390,9 +1386,9 @@ static void img_png_decode(INT32 args, int mode)
 	    {
 	       case 0:
 	       case 4:
-		  if (b->item[1].u.string->len==2)
+		  if (len==2)
 		  {
-		     int z=_png_c16(b->item[1].u.string->str[0],ihdr.bpp);
+		     int z=_png_c16(data[0],ihdr.bpp);
 		     push_int(z);
 		     push_int(z);
 		     push_int(z);
@@ -1401,25 +1397,24 @@ static void img_png_decode(INT32 args, int mode)
 		     continue;
 		  break;
 	       case 3:
-		  if (b->item[1].u.string->len!=1 ||
+		  if (len!=1 ||
 		      !ct || ct->type!=NCT_FLAT ||
-		      b->item[1].u.string->str[0] >=
-		      ct->u.flat.numentries)
+		      data[0] >= ct->u.flat.numentries)
 		     continue;
 		  else
 		  {
-		     push_int(ct->u.flat.entries[(int)b->item[1].u.string->str[0]].color.r);
-		     push_int(ct->u.flat.entries[(int)b->item[1].u.string->str[0]].color.g);
-		     push_int(ct->u.flat.entries[(int)b->item[1].u.string->str[0]].color.b);
+		     push_int(ct->u.flat.entries[data[0]].color.r);
+		     push_int(ct->u.flat.entries[data[0]].color.g);
+		     push_int(ct->u.flat.entries[data[0]].color.b);
 		  }
                   break;
 	       default:
-		  if (b->item[1].u.string->len==6)
+		  if (len==6)
 		  {
 		     int j;
 		     for (j=0; j<3; j++)
 		     {
-			int z=_png_c16(b->item[1].u.string->str[j*2],ihdr.bpp);
+			int z=_png_c16(data[j*2],ihdr.bpp);
 			push_int(z);
 		     }
 		  } else