protected void readImage() {
 ix = readShort(); // (sub)image position & size
 iy = readShort();
 iw = readShort();
 ih = readShort();

 int packed = read();
 lctFlag = (packed & 0x80) != 0; // 1 - local color table flag
 interlace = (packed & 0x40) != 0; // 2 - interlace flag
 // 3 - sort flag
 // 4-5 - reserved
 lctSize = 2 << (packed & 7); // 6-8 - local color table size

 if (lctFlag) {
   lct = readColorTable(lctSize); // read table
   act = lct; // make local table active
 } else {
   act = gct; // make global table active
   if (bgIndex == transIndex)
     bgColor = 0;
 }
 int save = 0;
 if (transparency) {
   save = act[transIndex];
   act[transIndex] = 0; // set transparent color if specified
 }

 if (act == null) {
   status = STATUS_FORMAT_ERROR; // no color table defined
 }

 if (err())
   return;

 decodeImageData(); // decode pixel data
 skip();

 if (err())
   return;

 frameCount++;

 // create new image to receive frame data
 image = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB_PRE);

 setPixels(); // transfer pixel data to image

 frames.add(new GifFrame(image, delay)); // add image to frame list

 if (transparency) {
   act[transIndex] = save;
 }
 resetFrame();

}