• This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn more.

How to utilize existing PHP class in Xenforo?


Well-known member
I need to run png images through this class to extract a block of text stored in them. Been using it for awhile in a php script but now that its time to use it for a xenforo addon I am running into trouble.

The original code is:
class PNG_Reader
    private $_chunks;
    private $_fp;

    function __construct($file) {
        if (!file_exists($file)) {
            throw new Exception('File does not exist');

        $this->_chunks = array ();

        // Open the file
        $this->_fp = fopen($file, 'r');

        if (!$this->_fp)
            throw new Exception('Unable to open file');

        // Read the magic bytes and verify
        $header = fread($this->_fp, 8);

        if ($header != "\x89PNG\x0d\x0a\x1a\x0a")
            throw new Exception('Is not a valid PNG image');

        // Loop through the chunks. Byte 0-3 is length, Byte 4-7 is type
        $chunkHeader = fread($this->_fp, 8);

        while ($chunkHeader) {
            // Extract length and type from binary data
            $chunk = @unpack('Nsize/a4type', $chunkHeader);

            // Store position into internal array
            if ($this->_chunks[$chunk['type']] === null)
                $this->_chunks[$chunk['type']] = array ();
            $this->_chunks[$chunk['type']][] = array (
                'offset' => ftell($this->_fp),
                'size' => $chunk['size']

            // Skip to next chunk (over body and CRC)
            fseek($this->_fp, $chunk['size'] + 4, SEEK_CUR);

            // Read next chunk header
            $chunkHeader = fread($this->_fp, 8);

    function __destruct() { fclose($this->_fp); }

    // Returns all chunks of said type
    public function get_chunks($type) {
        if ($this->_chunks[$type] === null)
            return null;

        $chunks = array ();

        foreach ($this->_chunks[$type] as $chunk) {
            if ($chunk['size'] > 0) {
                fseek($this->_fp, $chunk['offset'], SEEK_SET);
                $chunks[] = fread($this->_fp, $chunk['size']);
            } else {
                $chunks[] = '';

        return $chunks;
Previously called like:
$png = PNG_Reader('$filename);
    $rawTextData = $png->get_chunks('tEXt');
One of the things I tried was renaming the class tbg_pbss_reader and then placing the file at /library/tbg/pbss/reader.php and changing function __construct to public function __construct.

No matter what I do the closest I get is an error ErrorException: Undefined index: IHDR tripping off this line:
if ($this->_chunks[$chunk['type']] === null)
Last edited: