Heim > Artikel > Backend-Entwicklung > Fehlerbehebung und Änderung von GIFDecoder, vollständiger Code und Demo sind beigefügt.
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 gibt Obst10 Yuan Zahl ,wie Out 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
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.