5

画像をキャプチャしてサーバー経由でアップロードするアプリケーションに取り組んでいます。アプリケーションは Android And I Phone にあります。Android から画像を投稿する場合はキロバイト単位ですが、I Phone から画像を投稿する場合は MB サイズです。

IPHONE 5 から URL を指定して投稿した画像をブラウザ上で表示すると、本来の画像が正しく表示されますが、その画像を A​​ndroid 端末にダウンロードして IMAGE VIEW で表示すると、左側に 90 度傾いて表示されます。

AndroidまたはI Phoneで画像をダウンロードした後、ローテーションコードは使用していません。

I Phone では、画像は問題なく表示されます。

Androidからキャプチャした画像もそのまま表示されます。I Phone からキャプチャした低解像度の画像も、Android で直接表示されます。

Android からアップロードされた画像:

https://s3.amazonaws.com/WeddingApp/Weddingimage/933_6_stan.jpg

I Phone からアップロードされた画像:

https://s3.amazonaws.com/WeddingApp/Weddingimage/937_6_stan.jpg


public static boolean downloadFile(final String fileURL,File directory,Context CONTEXT){
        try{
            URL url = new URL(fileURL);

            URLConnection ucon = url.openConnection();
            ucon.setReadTimeout(35000);
            ucon.setConnectTimeout(10000);

            InputStream is = ucon.getInputStream();
            BufferedInputStream inStream = new BufferedInputStream(is, 1024 * 5);

            File file = directory;

            if (file.exists())
            {
                file.delete();
            }
            file.createNewFile();

            FileOutputStream outStream = new FileOutputStream(file);
            byte[] buff = new byte[5 * 1024];

            int len;
            while ((len = inStream.read(buff)) != -1)
            {
                outStream.write(buff, 0, len);
            }

            outStream.flush();
            outStream.close();
            inStream.close();

        }
        catch (IOException e){  //IF SDCARD NOT EXIST THEN PASS RESPONSE TRUE`  
            e.printStackTrace();
            return false;
        }catch(Exception e){
            e.printStackTrace();
            return false;
        }

        return true;
    } 

私に提案してください。

4

2 に答える 2

5

これは、iPhone のばかげた新しいカメラの実装によるものです。私は研究で以下を見つけました(以下に出典を示します):

1. iPhone カメラの「上」方向の解釈は、私たちが知っている実際の「上」方向から 90 度回転しています。あなたと私が「上」と呼んでいるのは、iPhoneの「左」または「右」です。カメラの向きが変更されました。これは、音量ボタンでの写真撮影をサポートできるようにするためです。

2.ただし、他のデバイスやカメラの向きが通常であることに注意し、それらのデバイスやブラウザで画像が適切に表示されるように、iOS はアップロードされた画像にEXIFデータを追加します。これは、画像のアップロード時に追加されます。リンクに記載されているように、EXIF は、画像が実際にどのように見えるかに関するすべての情報を含むメタデータです。

3.イメージがダウンロードされるターゲット プラットフォームは EXIF データを読み取り、イメージの正しい表現を表示することになっています。そのため、ターゲット プラットフォームが EXIF を読み取ると、受信した画像が 90 度回転していること、および受信したものではなく EXIF データに依存する必要があることがわかります。これが、iPhone カメラ アプリが画像を適切に表示できる理由です。

4ただし、すべての人が EXIF を読み取るわけではありません。EXIF を認識し、画像の EXIF データを読み取り、適切に表示するアプリとブラウザー。しかし、EXIF を認識していない人は、そのデータを読み取らず、受信したとおりに画像を表示します --> 90 度回転します

5人々は、写真を撮る前に iPhone を 90 度回転させることで、この問題を回避しました (写真を撮る前にカメラが正しい向きになるようにします)。

資力:

1. ソース 1

2. ソース 2

同じ問題を抱えている他の人:

1. SO 投稿 1

2. SO ポスト 2

于 2013-12-26T14:54:57.500 に答える
2

この問題は、画像で見つかったEXIFデータに関連しているようです。画像を表示する前に処理する必要があります。すべてのカメラが EXIF データを出力するとは限らないようです。この問題は、一部の Android ハンドセットでのみ発生するためです。見てみましょう: http://commons.wikimedia.org/wiki/Commons:Exif#Orientation_.28rotation_and_mirroring.29

編集: 次のようなものを実装できます:

public Bitmap getBitmap(String path){
    Bitmap tmpBitmap = BitmapFactory.decodeFile(path);
            Bitmap bitmap = null;
            if(path != null){
                try {
                    ExifInterface ei = new ExifInterface(path);
                    int orientation = ei.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
                    Matrix mtx = new Matrix();
                    int w = tmpBitmap.getWidth();
                    int h = tmpBitmap.getHeight();
                    switch (orientation) {
                    case ExifInterface.ORIENTATION_ROTATE_90:
                        //rotate CCW
                        mtx.preRotate(-90);
                        bitmap = Bitmap.createBitmap(tmpBitmap, 0, 0, w, h, mtx, true);
                        break;

                    case ExifInterface.ORIENTATION_ROTATE_270:
                        //rotate CW
                        mtx.preRotate(90);
                        bitmap = Bitmap.createBitmap(tmpBitmap, 0, 0, w, h, mtx, true);
                        break;

                        //CONSIDER OTHER CASES HERE....

                    default:
                        bitmap = tmpBitmap;
                        break;
                    }

                } catch (Exception e) {
                    e.printStackTrace();
                }

            }
    return bitmap;
}

よろしく。

于 2013-12-26T14:56:02.523 に答える