概要
圧縮を気にせずに、できるだけ早く .png ファイルを書きたいと思っています。つまり、ファイル サイズはあまり気にしませんが、できるだけ早く書き込みが行われるように気を付けています。
動機
クライアント側で OpenLayers を使用し、バックエンドで python/C++ を使用して Web ベースのマップ アプリケーションを作成しています。アプリケーションは、ユーザーがマップ上を移動するときに動的コンテンツをすばやく描画できる必要があります。タイルベース (256x256 タイル) と単一画像ベース (「単一タイル」) の両方のバージョンが動作していますが、どちらの場合も、バックエンド レンダリングの最も遅い部分は、実際には画像を png ファイルとして保存することです ( -ディスクまたはメモリ内)。たとえば、特定のビューの「raw」、「tga」、または「tiff」バージョンを約 200 ミリ秒で生成できる場合がありますが、.png バージョンを生成するのに 1.2 秒ほどかかります。保存にはほぼ 1 秒かかりますが、他の形式を実際に保存する時間は 100 ミリ秒以下です (「生の」ファイルは .png ファイルの 5 倍のサイズですが)。また、このファイル保存時間は、結果のイメージをサーバーからクライアントに転送する時間よりも大幅に長くなります。(私のアプリの重要な特性の 1 つは、一般に「バックエンド」がブラウザーと同じマシンで実行されるため、大きなファイルであっても転送時間は無視できることです。)
.png の書き込みを高速化できると思いました (C++ から libpng を使用する場合)。
png_set_compression_level( png_ptr, 0 );
png_write_...
関数を呼び出す前に。ただし、その呼び出しは確かに libpng によるファイルの圧縮を停止しているように見えますが (結果のファイルは .raw ファイルとほぼ同じサイズになります)、.png の保存が著しく高速になるわけではありません。
助けてください
これらの画像には .png を使用する必要があります。これは、これらの画像をベース マップの上に透明なオーバーレイにする必要があり、GIF で提供される 256 色以上が必要だからです。OpenLayers は単純に html img タグを使用しているため、有効な img 形式しか使用できないと理解しています。
実際の圧縮を行わずに.pngファイルをすばやく書き込む方法があると思います(.pngは「常に圧縮」されていることは理解していますが、これには「ヌル圧縮」が含まれる可能性があると思いました)。単純な固定ヘッダーの後に圧縮されていないデータが続き、その後に固定フッターが続くように書くことができるはずです。または、同じアイデアかもしれませんが、行ごとの方法です。ポイントは、メモリ内のこの 2.5 MB の生データを C++ で非常に迅速にループ処理し、さまざまなファイル形式に非常に迅速にダンプできることです。 、非圧縮の .png 形式にもすばやく変換できます。
そうですか?それを行うコードの例がどこにあるか知っていますか?