GIFDecoder のトラブルシューティングと変更には、完全なコードとデモが添付されています
前書き
今日は小さな成果があったので記録しておきます
Gif画像処理
ビジネスニーズのため、最初のフレーム。 GIF アニメーションをインターセプトする必要があるので、検索すると GIF 画像を処理するために使用される GIFDecoder のようなクラスを見つけました。完全なコンテンツではありません。サイトの情報が整理され、ようやく使用できるようになりました。
例外が発生しました
デモの実行中に、表示エラーの問題が発生しました
通知: 未定義のオフセット: 4 in /Applications/XAMPP/xamppfiles/htdocs/giftest/gifdecoder.class.php の 83 行目
ソースコードを見ると、83行目はこんな感じ
<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>
その理由
検索エンジンの努力の結果、私が得たより正式な説明は
offset: 次の数字は配列の添字が間違っています、通常、配列の値の範囲を超えます (配列
A[] が 10の場合)それぞれ 元 番号 、など フルーツ アウト さて、 A[10]は、エラー (注意: 未定義のオフセット: 10 ....)。配列の下の部分 マークは 0 から始まるので、この配列の添え字は 0~9 しかありません
理由は
添え字 4 の要素が見つからないということです
解決策
添え字を決める必要があります 存在しますか
<code><span>if</span> (<span>isset</span>(<span>$this</span>->GIF_buffer [<span>4</span>]) & <span>0x80</span>) { </code>
Jiang Ziがやります、ラララ〜
ソースコード
<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>
追記
- 小さな知識の積み重ねがやがて質的な変化に繋がります
- それ要約が上手いことは悪いことではありません
- 関数は3回書いても変わります、それでも同じならそれはあなた自身の問題です
上記は、GIFDecoder のトラブルシューティングと変更を紹介したもので、内容を含む完全なコードとデモが添付されています。PHP チュートリアルに興味のある友人に役立つことを願っています。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









多くのユーザーはスマートウォッチを選ぶときにファーウェイブランドを選択しますが、その中でもファーウェイ GT3pro と GT4 は非常に人気のある選択肢であり、多くのユーザーはファーウェイ GT3pro と GT4 の違いに興味を持っています。 Huawei GT3pro と GT4 の違いは何ですか? 1. 外観 GT4: 46mm と 41mm、材質はガラスミラー + ステンレススチールボディ + 高解像度ファイバーバックシェルです。 GT3pro: 46.6mm および 42.9mm、材質はサファイアガラス + チタンボディ/セラミックボディ + セラミックバックシェルです。 2. 健全な GT4: 最新の Huawei Truseen5.5+ アルゴリズムを使用すると、結果はより正確になります。 GT3pro: ECG 心電図と血管と安全性を追加

Windows 11 で Snipping Tool が機能しない理由 問題の根本原因を理解すると、適切な解決策を見つけるのに役立ちます。 Snipping Tool が正しく動作しない主な理由は次のとおりです。 フォーカス アシスタントがオンになっている: これにより、Snipping Tool が開かなくなります。破損したアプリケーション: 起動時にスニッピング ツールがクラッシュする場合は、破損している可能性があります。古いグラフィック ドライバー: 互換性のないドライバーは、スニッピング ツールに干渉する可能性があります。他のアプリケーションからの干渉: 実行中の他のアプリケーションが Snipping Tool と競合する可能性があります。証明書の有効期限が切れています: アップグレード プロセス中のエラーにより、この問題が発生する可能性があります。これらの簡単な解決策は、ほとんどのユーザーに適しており、特別な技術知識は必要ありません。 1. Windows および Microsoft Store アプリを更新する

パート 1: 最初のトラブルシューティング手順 Apple のシステムステータスを確認する: 複雑な解決策を掘り下げる前に、基本から始めましょう。問題はデバイスにあるのではなく、Apple のサーバーがダウンしている可能性があります。 Apple のシステム ステータス ページにアクセスして、AppStore が適切に動作しているかどうかを確認してください。問題があれば、Apple が修正してくれるのを待つしかありません。インターネット接続を確認します。「AppStore に接続できません」問題は接続不良が原因である場合があるため、安定したインターネット接続があることを確認してください。 Wi-Fi とモバイル データを切り替えるか、ネットワーク設定をリセットしてみてください ([一般] > [リセット] > [ネットワーク設定のリセット] > [設定])。 iOS バージョンを更新します。

php提交表单通过后,弹出的对话框怎样在当前页弹出php提交表单通过后,弹出的对话框怎样在当前页弹出而不是在空白页弹出?想实现这样的效果:而不是空白页弹出:------解决方案--------------------如果你的验证用PHP在后端,那么就用Ajax;仅供参考:HTML code

同僚は、これによって指摘されたバグのために立ち往生しました。Vue2 のこの指摘の問題により、アロー関数が使用され、その結果、対応する props を取得できなくなりました。私がそれを彼に紹介したとき、彼はそれを知りませんでした。その後、私はわざとフロントエンド コミュニケーション グループに目を向けました。これまでのところ、フロントエンド プログラマーの少なくとも 70% はまだそれを理解していません。今日私はそれを共有しますyou this link. もしすべてが間違っている場合 まだ学習していない場合は、大きな口を与えてください。

Watch4proとgtはそれぞれ特徴や適用シーンが異なりますが、総合的な機能、高性能、スタイリッシュな外観を重視し、価格は高くてもいいという方にはWatch 4 Proの方が適しているかもしれません。高度な機能要件はなく、バッテリー寿命と手頃な価格を重視する場合は、GT シリーズの方が適しているかもしれません。最終的な選択は、個人のニーズ、予算、好みに基づいて決定する必要がありますが、購入する前に自分のニーズを慎重に検討し、さまざまな製品のレビューや比較を参照して、より情報に基づいた選択を行うことをお勧めします。

1. JavaNIOBuffers を使用して NIOChannel と対話する概念。チャネルからバッファへのデータの読み取り、およびバッファからチャネルへのデータの書き込み。バッファの 3 つのプロパティ、つまり容量、位置ロケーション、制限を制御する必要があります。 2. インスタンス publicstaticvoidmain(String[]args){//長さ 10IntBufferintBuffer=IntBuffer.allocate(10);for(inti=0;i) のバッファを生成します。

この記事は、vue ソース コードを解釈するのに役立ち、これを使用して Vue2 のさまざまなオプションのプロパティにアクセスできる理由を紹介します。
