Android EXIF画像処理

2900 ワード

前言
最近1つのプロジェクトをして、チャットする时写真を撮って送信する必要があって、そこでシステムの持参するカメラを呼び出して、写真を撮って送信して、okはとてもeasyの完成して、そして送信して、完璧です...しかし、ある日、MMをテストして私に教えて、あなたの写真はだめですね.私が縦に撮ったのはどうしてプレビューが横になっているのか、送信も横になっているのか.いいか?第一反応は携帯電話のテストを出して、寝槽、明らかに良いですか?何の携帯で測ったんだ?華碩!サムスン!よし...そこで変えて、いろいろな方法を考えて、photoviewの回転を始めて、それからMatrixで回転して、それから重力センサーを使って、いいでしょう...だめだ絶望に瀕するing...
EXIF
まずexif図についてお話しします.あの咳咳、ここはみんなでウィキペディアに行って見ればいいです.とにかくexif画像がたくさんの画像の情報を保存していることを知る必要があります.そして、以下のステップを行うことができる.
特殊機種
サムスンや華碩のような特殊な機種では、彼らが撮った写真には画像のorientation情報が存在します.この時、私たちが処理しなければ、効果は以下のようになります.
GIF.gif
いくつかの特殊な机种の上で、画像はずっと縦に横になって表示して、一部の子供靴は、横に撮ればいいのではないかと言うかもしれませんが、お客様は満足していません...
解決策
解決策は、このexifピクチャのorientation情報を取得し、それに対応する処理を行い、正しい方向に表示させることである.キャッシュと送信
ここではコアコードを示す.
    /**
     *   bitmap     
     * @param bitmapFile file
     * @return
     * @throws IOException
     */
    private int resolveBitmapOrientation(File bitmapFile) throws IOException {
        ExifInterface exif;
        if (bitmapFile != null) {
            exif = new ExifInterface(bitmapFile.getAbsolutePath());
            return exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
        } else {
            return 0;
        }
    }

上のコードはあなたが撮った画像のorientation情報を取得するためのものです.
次に、それに対応する回転を正しい方向にする.
/**
     *            
     *
     * @param bitmap      bitmap
     * @param orientation orientation
     * @return bitmap
     */
    private Bitmap applyOrientation(Bitmap bitmap, int orientation) {
        int rotate;
        switch (orientation) {
            case ExifInterface.ORIENTATION_ROTATE_270:
                rotate = 270;
                break;
            case ExifInterface.ORIENTATION_ROTATE_180:
                rotate = 180;
                break;
            case ExifInterface.ORIENTATION_ROTATE_90:
                rotate = 90;
                break;
            default:
                return bitmap;
        }

        int width = bitmap.getWidth();
        int height = bitmap.getHeight();
        Matrix mtx = new Matrix();
        mtx.postRotate(rotate);
        return Bitmap.createBitmap(bitmap, 0, 0, width, height, mtx, true);
    }

その後、効果図を見てみましょう.
GIF1.gif
これにより、一部の携帯電話における写真プレビューが横方向であるという問題が解決する. , , , , 。 , 。
公式には、25.1.0サポートライブラリのリリースに伴い、サポートライブラリの大家族が新しいメンバーを迎えた:ExifInterfaceサポートライブラリ.Android 7.1はフレームワークExifInterfaceに対する重大な改善を導入しているため、サポートライブラリのExifInterfaceを通じてすべてのAPI 9以上のデバイスがこれらの改善を利用できるようにしてこそ意味がある.
OK、公式にはよく言われていますが、これらを有意義にするにはサポートライブラリ25.10を使用する必要がありますが、どのように使用しますか?gradleにcompile "com.android.support:exifinterface:25.1.0"を加えるだけでいいです.最後に転送ドアを添付:ExifInterfaceサポートライブラリの概要
後記
もちろん、ここではexifピクチャを処理するためのコアコードのみを示すが、具体的な開発では実際の状況に応じて対応する処理を行う.