8

私は、一連の同様の画像をネット経由で転送する必要があるプロジェクトを書いています。処理を高速化するために、ほとんどのムービー コーデックが行うことを考えてみました。キーフレームがあり、変更を送信するだけです。

今、私が得たのはBufferedImages のセットなので、テキスト ファイルに例えると、基本的にそれらを比較してパッチを送信したいだけです。しかし、私はこれまで画像を実際に扱ったことがないので、これを行うとしたら、かなりくだらないものになります。

では、このようなものを実装する最良の方法は何ですか、またはこのようなものに適した実装が既にありますか?

画像をバイト配列に保存し、それらをバイナリ差分することはあまり効果的ではないと思います。

編集:これを画像にストリーミングする必要があります。Edit2:実装の詳細についてはそれほど重要ではありません。アルゴリズムの最も効率的なアイデアは何ですか。5px のチャンクでのみ動作し、目で気付かない程度の変更しかない場合は px を無視しないようにします (多少の品質低下は許容されます)。

4

6 に答える 6

6

単純なアプローチは、2つの画像に対してXOR演算と同等の操作を行うことです。これにより、同一のピクセル(ゼロになる)と変更されたピクセル(ゼロ以外)が表示されます。

ほとんど感知できない違いを気にしない場合は、代わりに、「減算」ブレンドを使用してから右シフトして、1ビットまたは2ビットの違いを破棄します。

次に、境界(おそらく単純な長方形)を計算して、デルタのみを送信できます。デルタには、多くのゼロまたは多くても右端のビットの差がほとんどないバイトが含まれる可能性があります。つまり、「エントロピー」が低くなります。つまり、理論的には、最新の圧縮アルゴリズムを使用して高度に圧縮可能である必要があります。

受信側では、逆のプロセスも同様に簡単です。デルタとバウンディングボックスを指定して、デルタを解凍し、それを前の/既存の画像の影響を受ける領域に適用します(XOR、または左シフトしてから追加)。

より洗練されたロスレスアプローチについては、アニメーション化されたGIF / PNGがどのようにアニメーション化されるか、およびフレーム間のデルタ情報を計算/エンコードするためにどのアルゴリズムが使用されるかを調べてください。たとえば、アルゴリズムを使用してアニメーションGIFを作成するための最良の方法は何ですか?を参照してください。

さらに洗練されたアプローチの場合、現実世界の画像を処理するとき、および不可逆ルートを進んで実行する場合は、すでにそれをほのめかしています。ビデオコーデックがフレームをエンコード/送信する方法を見てください。たとえば、MPEGVideoEncodingです。

言うまでもなく、(エンコード/デコードプロセスの)複雑さと、ある時点で送信されるデータのサイズの縮小との間にはトレードオフがあるため、どちらかの側で追加されたオーバーヘッドが節約に値するかどうかを判断する必要があります。トランスミッション。

于 2011-08-19T03:47:45.580 に答える
3

を使用して、BufferedImage のすべてのピクセルを反復処理できますgetRGB(int x, int y)

for (int x = 0; x < img.getWidth(); ++x)
{
    for (int y = 0; y < img.getHeight(); ++y)
    {
        int oldARGB = oldImg.getRGB(x, y);
        int newARGB = img.getRGB(x, y);
        if (oldARGB != newARGB)
        {
            // handle the diffrence
        }
    }

}
于 2011-07-07T18:00:53.660 に答える
0

投資したい作業の量に応じて、かなり簡単な解決策を提案します。これらの画像をビットマップとして保存し、7z で圧縮します。次に、アーカイブを送信します。

于 2011-07-07T16:32:36.027 に答える
0

品質の低下を気にせず、多くの手動作業を必要とせずに帯域幅に関して非常に効率的なソリューションが必要な場合は、実際のムービー コーデックで画像をエンコードすることもできます。特に、計算をオフロードするための GPU があり、そのアプローチは計算作業の点でも非常に効率的です。

于 2016-07-08T22:25:27.717 に答える
-2

アプリの開発に時間を費やしてから、問題がある場合はパフォーマンスの改善を評価することをお勧めします。このすべてがYAGNIになると思います。

物事をスピードアップするために、私はやろうと思いました...

これは必要条件ではなく、単に「もし...だったらかっこいいと思いませんか?」ということです。今日のネットワーク速度では、数百メガの転送でも 1 分以内に完了できます。

于 2011-08-18T22:58:46.537 に答える