1. 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?

Discussion in 'XenForo Development Discussions' started by rainmotorsports, May 9, 2014.

  1. rainmotorsports

    rainmotorsports 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: May 9, 2014
  2. rainmotorsports

    rainmotorsports Well-Known Member

    Oops, edited the previously called like to be correct. Had something I tried in it earlier

Share This Page