私はこれについてしばらく探していましたが、私が望むものを見つけられなかったので、ここに私の問題があります:
PHP を使用して、20000 ギガピクセルの非常に大きな画像ファイルを作成したいのですが、この大きな画像の特定の場所に小さな画像を追加したいと考えています。私のコンピューターには、画像全体をロードしてそのようにピクセルを操作するのに十分な RAM がないため、ハードディスク上の画像データにアクセスして何らかの方法で操作する必要があると思います。私を助けてくれてありがとう:)
ImageMagick は、非常に大きなファイルの操作をサポートしています。PHP/ImageMagick API でのサポートは見当たりませんが、コマンド ライン プログラムを呼び出して (exec)、そのディスク キャッシュまたはストリーミング オプションのいずれかを使用できます。
www.imagemagick.orgには、大きなファイルを扱うためのドキュメントがいくつかあります。
そのサイズの画像で何をしますか?ブラウザで提供することはできませんでした。サーバーにロードできたとしても、すべてのサーバー リソースが占有されるため、その間はサーバーを他の目的で使用することはできません。
簡単に言えば、そのような規模の画像を RAM 内の単一のファイルとして処理することは、専用の非常に強力なマシンを持っていない限り、問題外です。20k x 20k ピクセルでは、単純なモノクロ画像でも 400MB かかります。それを有用な色深度にスケールアップすると、グラフィックを保持するためだけにギガバイトの RAM について話していることになります。
解決策は、同じ問題を考えると、他の人が何をしているのかを見ることだと思います.
その縮尺の画像を使用する実際のアプリケーション (たとえば、マッピング アプリやこのようなパノラマ写真) は、画像を一連のはるかに小さなブロックとして保存します。各ブロックは、それ自体が小さな画像です。また、通常、ズーム レベルごとに個別のブロック セットも用意されています。単一の巨大な画像ファイルを処理することは、現実的なサーバー環境ではあり得ませんが、チャンクを小さくすると、ブラウザーとサーバーの両方で簡単に処理できます。サーバーは、現在のビューにあるユーザーにブロックを送信するだけです。ユーザーがスクロールまたはズームすると、より多くのブロックが送信されます。
あなたの質問は、大きな画像の特定の場所に小さな画像を追加することに言及しています。繰り返しになりますが、他の人がこれをどのように行っているかを見ると、Google マップや他の人はこの種のことをレイヤリング システムを使用して処理しています。レイヤーが構築され、ブラウザーに個別に送信されます。
質問への直接的な回答ではないことは承知していますが、考えられる選択肢がいくつかあることを願っています。
画像ではなく単純なファイルを保持し、ピクセルデータを任意のカスタム形式で保存するだけです。PHPにはfseek関数があり、ファイル内の任意の場所にジャンプできるため、必要な場所を計算して読み取り/書き込みを実行できます。サイズがWxHの画像があり、各ピクセルが3バイトかかる場合、ファイル内のピクセル(X、Y)のアドレスは(W * Y + X)*3になります。