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();
    
      }