1

というわけで、Androidでファイル共有アプリを使っています。サーバーにアップロードされる複製コピーを作成します。

問題 次のコードは、手動で作成した複製コピーに対して機能します。つまり、ファイルマネージャーを使用して、ファイルを長押しして同じディレクトリにコピーします。次に、私の関数は を返しますtrue。アプリによる複製画像と元の画像を比較すると、false.

MD5 チェックサムは異なるため、オプション外です。

コード

    public boolean equals(Bitmap bitmap1, Bitmap bitmap2) {
        ByteBuffer buffer1 = ByteBuffer.allocate(bitmap1.getHeight()
                * bitmap1.getRowBytes());
        bitmap1.copyPixelsToBuffer(buffer1);

        ByteBuffer buffer2 = ByteBuffer.allocate(bitmap2.getHeight()
                * bitmap2.getRowBytes());
        bitmap2.copyPixelsToBuffer(buffer2);

        return Arrays.equals(buffer1.array(), buffer2.array());
    }

画像は次のとおりです。

元の画像 -オリジナル

アプリによって作成された複製画像 -複製

私のコードは現在、これら 2 つの画像を比較しているときに false を返します。コードが true を返すようにするにはどうすればよいですか?

4

1 に答える 1

1

問題は、JPEG 圧縮によって作成されたアーティファクトによるものです。画像を常に PNG で保持できる場合、問題はおそらく解決されます。それができない場合は、画像を比較するためのより優れたアルゴリズムが必要です。これは、Python で URL のイメージをファイルシステムのイメージと比較するで説明されている問題とまったく同じです。

たとえば、前述のアルゴリズムを実行すると、99% を超える類似性が得られます。その類似値を使用すると、画像が同じであると言えます。

于 2013-01-05T13:52:57.277 に答える