Heim  >  Artikel  >  Backend-Entwicklung  >  Fehlerbehebung und Änderung von GIFDecoder, vollständiger Code und Demo sind beigefügt.

Fehlerbehebung und Änderung von GIFDecoder, vollständiger Code und Demo sind beigefügt.

WBOY
WBOYOriginal
2016-08-08 09:23:541276Durchsuche

Vorwort

Ich habe schon lange keinen technischen Blog mehr geschrieben. Ich werde sie heute aufzeichnen und als Backup aufbewahren

Gif-Bild Verarbeitung

Aus geschäftlichen Gründen muss ich das erste Bild der GIF-Animation abfangen. Dann habe ich gesucht und eine Klasse wie GIFDecoder gefunden, die zum Verarbeiten von GIF-Bildern verwendet wird. Die heimische Blog-Umgebung ist immer noch so schlecht, dass ich sie überall von verschiedenen Websites und Blogs kopiert habe, aber es gibt keinen vollständigen Inhalt. Nachdem ich die Informationen von mehreren Websites sortiert habe, sind sie endlich verwendbar.

Eine Ausnahme ist aufgetreten

Beim Ausführen der Demo wurde ein Fehler angezeigt

Hinweis: Undefinierter Offset: 4 in /Applications/XAMPP/xamppfiles/ htdocs/giftest /gifdecoder.class.php in Zeile 83

Sehen Sie sich den Quellcode an und stellen Sie fest, dass Zeile 83 so aussieht

<code><span><span>function</span><span>GIFReadExtensions</span><span>()</span> {</span>
            GIFDecoder::GIFGetByte(<span>1</span>);
            <span>if</span> (<span>$this</span>->GIF_buffer [<span>0</span>] == <span>0xff</span>) {
                <span>for</span> (;;) {
                    GIFDecoder::GIFGetByte(<span>1</span>);
                    <span>if</span> (( <span>$u</span> = <span>$this</span>->GIF_buffer [<span>0</span>] ) == <span>0x00</span>) {
                        <span>break</span>;
                    }
                    GIFDecoder::GIFGetByte(<span>$u</span>);
                    <span>if</span> (<span>$u</span> == <span>0x03</span>) {
                        <span>$this</span>->GIF_anloop = ( <span>$this</span>->GIF_buffer [<span>1</span>] | <span>$this</span>->GIF_buffer [<span>2</span>] << <span>8</span> );
                    }
                }
            } <span>else</span> {
                <span>for</span> (;;) {
                    GIFDecoder::GIFGetByte(<span>1</span>);
                    <span>if</span> (( <span>$u</span> = <span>$this</span>->GIF_buffer [<span>0</span>] ) == <span>0x00</span>) {
                        <span>break</span>;
                    }
                    GIFDecoder::GIFGetByte(<span>$u</span>);
                    <span>if</span> (<span>$u</span> == <span>0x04</span>) {
                        <span>if</span> (<span>$this</span>->GIF_buffer [<span>4</span>] & <span>0x80</span>) {   <span>//这里是第83行</span><span>$this</span>->GIF_dispos [] = ( <span>$this</span>->GIF_buffer [<span>0</span>] >> <span>2</span> ) - <span>1</span>;
                        } <span>else</span> {
                            <span>$this</span>->GIF_dispos [] = ( <span>$this</span>->GIF_buffer [<span>0</span>] >> <span>2</span> ) - <span>0</span>;
                        }
                        <span>$this</span>->GIF_delays [] = ( <span>$this</span>->GIF_buffer [<span>1</span>] | <span>$this</span>->GIF_buffer [<span>2</span>] << <span>8</span> );
                        <span>if</span> (<span>$this</span>->GIF_buffer [<span>3</span>]) {
                            <span>$this</span>->GIF_TransparentI = <span>$this</span>->GIF_buffer [<span>3</span>];
                        }
                    }
                }
            }
        }</code>

Der Grund

Nach der Suche Dank der Bemühungen der Engine lautete die formellere Erklärung

offset: Die folgende Zahl ist der falsche Array-Index, der im Allgemeinen außerhalb des Wertebereichs des Arrays liegt , ist das Array A[]Es gibt10 YuanZahl ,wie ObstOut Jetzt A[10] verursacht einen Fehler (Hinweis: Undefinierter Offset: 10 ...), da der Index des Arrays beginnt bei 0, daher kann der Index dieses Arrays nur 0 bis 9 sein.

Der Grund dafür ist, dass das

Array das Element mit nicht finden kann Index 4

Lösung

Wir müssen feststellen, ob der Index existiert

<code><span>if</span> (<span>isset</span>(<span>$this</span>->GIF_buffer [<span>4</span>]) & <span>0x80</span>) { </code>

Jiang Zi hat ihn, la la la~

Quellcode

<code><span><span><span><?php</span>/**
 * GIFDecoder  <br/>
 * 
 * 日期: 2015年05月21日   <br/>
 * 原作者: 不详           <br/>
 * 修改: CalvinLee       <br/>
 * 
 * 
 * <code>
 * require_once("gifdecoder.class.php");
 *
 * $FIC = "test.gif";
 * //获取gif的第一帧进行保存
 * if (file_exists($FIC)) {
 *      $GIF_frame = fread(fopen($FIC, 'rb'), filesize($FIC));
 *      $decoder = new GIFDecoder($GIF_frame);
 *      $frames = $decoder->GIFGetFrames();
 *      $i = 0; 
 *      $fname =  rand(1000, 9999). $FIC . "_0$i.png"; 
 *      $hfic = fopen("" . $fname, "wb");
 *      fwrite($hfic, $frames [$i]);
 *      fclose($hfic);
 * } 
 *  </code>
 * 
 * 
 *<span> @copyright</span> (c) 2015, Calvin Lee
 *<span> @author</span> Calvin Lee <diandianxiyu_@live.cn>

 */</span><span><span>Class</span><span>GIFDecoder</span> {</span><span>public</span><span>$GIF_TransparentR</span> = -<span>1</span>;
    <span>public</span><span>$GIF_TransparentG</span> = -<span>1</span>;
    <span>public</span><span>$GIF_TransparentB</span> = -<span>1</span>;
    <span>public</span><span>$GIF_TransparentI</span> = <span>0</span>;
    <span>public</span><span>$GIF_buffer</span> = <span>array</span>();
    <span>public</span><span>$GIF_arrays</span> = <span>array</span>();
    <span>public</span><span>$GIF_delays</span> = <span>array</span>();
    <span>public</span><span>$GIF_dispos</span> = <span>array</span>();
    <span>public</span><span>$GIF_stream</span> = <span>""</span>;
    <span>public</span><span>$GIF_string</span> = <span>""</span>;
    <span>public</span><span>$GIF_bfseek</span> = <span>0</span>;
    <span>public</span><span>$GIF_anloop</span> = <span>0</span>;
    <span>public</span><span>$GIF_screen</span> = <span>array</span>();
    <span>public</span><span>$GIF_global</span> = <span>array</span>();
    <span>public</span><span>$GIF_sorted</span>;
    <span>public</span><span>$GIF_colorS</span>;
    <span>public</span><span>$GIF_colorC</span>;
    <span>public</span><span>$GIF_colorF</span>;

    <span><span>function</span><span>GIFDecoder</span><span>(<span>$GIF_pointer</span>)</span> {</span><span>$this</span>->GIF_stream = <span>$GIF_pointer</span>;

        GIFDecoder::GIFGetByte(<span>6</span>);
        GIFDecoder::GIFGetByte(<span>7</span>);

        <span>$this</span>->GIF_screen = <span>$this</span>->GIF_buffer;
        <span>$this</span>->GIF_colorF = <span>$this</span>->GIF_buffer [<span>4</span>] & <span>0x80</span> ? <span>1</span> : <span>0</span>;
        <span>$this</span>->GIF_sorted = <span>$this</span>->GIF_buffer [<span>4</span>] & <span>0x08</span> ? <span>1</span> : <span>0</span>;
        <span>$this</span>->GIF_colorC = <span>$this</span>->GIF_buffer [<span>4</span>] & <span>0x07</span>;
        <span>$this</span>->GIF_colorS = <span>2</span> << <span>$this</span>->GIF_colorC;

        <span>if</span> (<span>$this</span>->GIF_colorF == <span>1</span>) {
            GIFDecoder::GIFGetByte(<span>3</span> * <span>$this</span>->GIF_colorS);
            <span>$this</span>->GIF_global = <span>$this</span>->GIF_buffer;
        }
        <span>for</span> (<span>$cycle</span> = <span>1</span>; <span>$cycle</span>;) {
            <span>if</span> (GIFDecoder::GIFGetByte(<span>1</span>)) {
                <span>switch</span> (<span>$this</span>->GIF_buffer [<span>0</span>]) {
                    <span>case</span><span>0x21</span>:
                        GIFDecoder::GIFReadExtensions();
                        <span>break</span>;
                    <span>case</span><span>0x2C</span>:
                        GIFDecoder::GIFReadDescriptor();
                        <span>break</span>;
                    <span>case</span><span>0x3B</span>:
                        <span>$cycle</span> = <span>0</span>;
                        <span>break</span>;
                }
            } <span>else</span> {
                <span>$cycle</span> = <span>0</span>;
            }
        }
    }

    <span><span>function</span><span>GIFReadExtensions</span><span>()</span> {</span>
        GIFDecoder::GIFGetByte(<span>1</span>);
        <span>if</span> (<span>$this</span>->GIF_buffer [<span>0</span>] == <span>0xff</span>) {
            <span>for</span> (;;) {
                GIFDecoder::GIFGetByte(<span>1</span>);
                <span>if</span> (( <span>$u</span> = <span>$this</span>->GIF_buffer [<span>0</span>] ) == <span>0x00</span>) {
                    <span>break</span>;
                }
                GIFDecoder::GIFGetByte(<span>$u</span>);
                <span>if</span> (<span>$u</span> == <span>0x03</span>) {
                    <span>$this</span>->GIF_anloop = ( <span>$this</span>->GIF_buffer [<span>1</span>] | <span>$this</span>->GIF_buffer [<span>2</span>] << <span>8</span> );
                }
            }
        } <span>else</span> {
            <span>for</span> (;;) {
                GIFDecoder::GIFGetByte(<span>1</span>);
                <span>if</span> (( <span>$u</span> = <span>$this</span>->GIF_buffer [<span>0</span>] ) == <span>0x00</span>) {
                    <span>break</span>;
                }
                GIFDecoder::GIFGetByte(<span>$u</span>);
                <span>if</span> (<span>$u</span> == <span>0x04</span>) {
                    <span>if</span> (<span>isset</span>(<span>$this</span>->GIF_buffer [<span>4</span>]) & <span>0x80</span>) {
                        <span>$this</span>->GIF_dispos [] = ( <span>$this</span>->GIF_buffer [<span>0</span>] >> <span>2</span> ) - <span>1</span>;
                    } <span>else</span> {
                        <span>$this</span>->GIF_dispos [] = ( <span>$this</span>->GIF_buffer [<span>0</span>] >> <span>2</span> ) - <span>0</span>;
                    }
                    <span>$this</span>->GIF_delays [] = ( <span>$this</span>->GIF_buffer [<span>1</span>] | <span>$this</span>->GIF_buffer [<span>2</span>] << <span>8</span> );
                    <span>if</span> (<span>$this</span>->GIF_buffer [<span>3</span>]) {
                        <span>$this</span>->GIF_TransparentI = <span>$this</span>->GIF_buffer [<span>3</span>];
                    }
                }
            }
        }
    }

    <span><span>function</span><span>GIFReadDescriptor</span><span>()</span> {</span><span>$GIF_screen</span> = <span>Array</span>();

        GIFDecoder::GIFGetByte(<span>9</span>);
        <span>$GIF_screen</span> = <span>$this</span>->GIF_buffer;
        <span>$GIF_colorF</span> = <span>$this</span>->GIF_buffer [<span>8</span>] & <span>0x80</span> ? <span>1</span> : <span>0</span>;
        <span>if</span> (<span>$GIF_colorF</span>) {
            <span>$GIF_code</span> = <span>$this</span>->GIF_buffer [<span>8</span>] & <span>0x07</span>;
            <span>$GIF_sort</span> = <span>$this</span>->GIF_buffer [<span>8</span>] & <span>0x20</span> ? <span>1</span> : <span>0</span>;
        } <span>else</span> {
            <span>$GIF_code</span> = <span>$this</span>->GIF_colorC;
            <span>$GIF_sort</span> = <span>$this</span>->GIF_sorted;
        }
        <span>$GIF_size</span> = <span>2</span> << <span>$GIF_code</span>;
        <span>$this</span>->GIF_screen [<span>4</span>] &= <span>0x70</span>;
        <span>$this</span>->GIF_screen [<span>4</span>] |= <span>0x80</span>;
        <span>$this</span>->GIF_screen [<span>4</span>] |= <span>$GIF_code</span>;
        <span>if</span> (<span>$GIF_sort</span>) {
            <span>$this</span>->GIF_screen [<span>4</span>] |= <span>0x08</span>;
        }

        <span>//GIF Data Begin</span><span>if</span> (<span>$this</span>->GIF_TransparentI) {
            <span>$this</span>->GIF_string = <span>"GIF89a"</span>;
        } <span>else</span> {
            <span>$this</span>->GIF_string = <span>"GIF87a"</span>;
        }
        GIFDecoder::GIFPutByte(<span>$this</span>->GIF_screen);
        <span>if</span> (<span>$GIF_colorF</span> == <span>1</span>) {
            GIFDecoder::GIFGetByte(<span>3</span> * <span>$GIF_size</span>);
            <span>if</span> (<span>$this</span>->GIF_TransparentI) {
                <span>$this</span>->GIF_TransparentR = <span>$this</span>->GIF_buffer [<span>3</span> * <span>$this</span>->GIF_TransparentI + <span>0</span>];
                <span>$this</span>->GIF_TransparentG = <span>$this</span>->GIF_buffer [<span>3</span> * <span>$this</span>->GIF_TransparentI + <span>1</span>];
                <span>$this</span>->GIF_TransparentB = <span>$this</span>->GIF_buffer [<span>3</span> * <span>$this</span>->GIF_TransparentI + <span>2</span>];
            }
            GIFDecoder::GIFPutByte(<span>$this</span>->GIF_buffer);
        } <span>else</span> {
            <span>if</span> (<span>$this</span>->GIF_TransparentI) {
                <span>$this</span>->GIF_TransparentR = <span>$this</span>->GIF_global [<span>3</span> * <span>$this</span>->GIF_TransparentI + <span>0</span>];
                <span>$this</span>->GIF_TransparentG = <span>$this</span>->GIF_global [<span>3</span> * <span>$this</span>->GIF_TransparentI + <span>1</span>];
                <span>$this</span>->GIF_TransparentB = <span>$this</span>->GIF_global [<span>3</span> * <span>$this</span>->GIF_TransparentI + <span>2</span>];
            }
            GIFDecoder::GIFPutByte(<span>$this</span>->GIF_global);
        }
        <span>if</span> (<span>$this</span>->GIF_TransparentI) {
            <span>$this</span>->GIF_string .= <span>"!\xF9\x04\x1\x0\x0"</span> . chr(<span>$this</span>->GIF_TransparentI) . <span>"\x0"</span>;
        }
        <span>$this</span>->GIF_string .= chr(<span>0x2C</span>);
        <span>$GIF_screen</span> [<span>8</span>] &= <span>0x40</span>;
        GIFDecoder::GIFPutByte(<span>$GIF_screen</span>);
        GIFDecoder::GIFGetByte(<span>1</span>);
        GIFDecoder::GIFPutByte(<span>$this</span>->GIF_buffer);
        <span>for</span> (;;) {
            GIFDecoder::GIFGetByte(<span>1</span>);
            GIFDecoder::GIFPutByte(<span>$this</span>->GIF_buffer);
            <span>if</span> (( <span>$u</span> = <span>$this</span>->GIF_buffer [<span>0</span>] ) == <span>0x00</span>) {
                <span>break</span>;
            }
            GIFDecoder::GIFGetByte(<span>$u</span>);
            GIFDecoder::GIFPutByte(<span>$this</span>->GIF_buffer);
        }
        <span>$this</span>->GIF_string .= chr(<span>0x3B</span>);
        <span>//GIF Data End</span><span>$gif_array</span> = &<span>$this</span>->GIF_arrays;
        <span>$gif_array</span>[] = <span>$this</span>->GIF_string;
    }

    <span><span>function</span><span>GIFGetByte</span><span>(<span>$len</span>)</span> {</span><span>$this</span>->GIF_buffer = <span>Array</span>();
        <span>for</span> (<span>$i</span> = <span>0</span>; <span>$i</span> < <span>$len</span>; <span>$i</span>++) {
            <span>if</span> (<span>$this</span>->GIF_bfseek > strlen(<span>$this</span>->GIF_stream)) {
                <span>return</span><span>0</span>;
            }
            <span>$this</span>->GIF_buffer[] = ord(<span>$this</span>->GIF_stream { <span>$this</span>->GIF_bfseek++});
        }
        <span>return</span><span>1</span>;
    }

    <span><span>function</span><span>GIFPutByte</span><span>(<span>$bytes</span>)</span> {</span><span>foreach</span> (<span>$bytes</span><span>as</span><span>$byte</span>) {
            <span>$this</span>->GIF_string .= chr(<span>$byte</span>);
        }
    }

    <span><span>function</span><span>GIFGetFrames</span><span>()</span> {</span><span>return</span> ( <span>$this</span>->GIF_arrays );
    }

    <span><span>function</span><span>GIFGetDelays</span><span>()</span> {</span><span>return</span> ( <span>$this</span>->GIF_delays );
    }

    <span><span>function</span><span>GIFGetLoop</span><span>()</span> {</span><span>return</span> ( <span>$this</span>->GIF_anloop );
    }

    <span><span>function</span><span>GIFGetDisposal</span><span>()</span> {</span><span>return</span> ( <span>$this</span>->GIF_dispos );
    }

    <span><span>function</span><span>GIFGetTransparentR</span><span>()</span> {</span><span>return</span> ( <span>$this</span>->GIF_TransparentR );
    }

    <span><span>function</span><span>GIFGetTransparentG</span><span>()</span> {</span><span>return</span> ( <span>$this</span>->GIF_TransparentG );
    }

    <span><span>function</span><span>GIFGetTransparentB</span><span>()</span> {</span><span>return</span> ( <span>$this</span>->GIF_TransparentB );
    }

}

<span>?></span></span></span></code>

Postscript

  • Kleine Wissensanhäufungen führen irgendwann zu qualitativen Veränderungen
  • Es schadet nie, gut im Zusammenfassen zu sein
  • Wenn Sie eine Funktion dreimal schreiben, wird sie anders, wenn sie immer noch gleich bleibt. Wenn ja, dann ist es Ihr eigenes Problem

Das Obige stellt die Fehlerbehebung und Änderung von GIFDecoder vor. Im Anhang finden Sie den vollständigen Code und die Demo, einschließlich des Inhalts. Ich hoffe, dass dies für Freunde hilfreich ist, die sich für PHP-Tutorials interessieren.

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Vorheriger Artikel:PHP-Datei in Array einlesenNächster Artikel:PHP-Datei in Array einlesen