Изображение появляется под углом 90 градусов при загрузке с сервера в Android?

Работаем над приложением, в котором мы захватываем изображения и загружаем их на сервер. Приложение находится на Android And I Phone. Когда мы публикуем изображение с Android, оно измеряется в килобайтах, но когда мы публикуем изображение с телефона, оно имеет размер МБ.

Когда мы загружаем изображения с IPHONE 5 с URL-адресом в браузере, они выглядят хорошо, как и предполагалось, но когда мы загружаем это изображение на устройство Android и показываем в 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;
    } 

Пожалуйста, предложите мне.


person Sam-In-TechValens    schedule 26.12.2013    source источник
comment
у меня тоже такая же проблема   -  person ROHIT PARMAR    schedule 26.12.2013
comment
У меня это происходит на некоторых устройствах Android, даже когда я делаю снимок, но в галерее они отображаются правильно.   -  person Junior Buckeridge    schedule 26.12.2013


Ответы (2)


Похоже, проблема связана с данными EXIF, найденными на изображениях. Мы должны обработать его перед отображением изображения. Похоже, что не каждая камера выводит данные EXIF, потому что эта проблема возникает только у меня на некоторых телефонах Android. Взгляните на: http://commons.wikimedia.org/wiki/Commons:Exif#Orientation_.28rotation_and_mirroring.29

EDIT: мы могли бы реализовать что-то вроде:

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;
}

С уважением.

person Junior Buckeridge    schedule 26.12.2013
comment
Просто с небольшой правкой... в случае ExifInterface.ORIENTATION_ROTATE_90:... где я должен сделать ориентацию +90 вместо ориентации -90... у меня это сработало. Просто дайте мне знать, правильно ли я иду с этим редактированием. - person Sam-In-TechValens; 27.12.2013

Это из-за глупой реализации новой камеры 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. ТАК Пост 1

2. ТАК Пост 2

person sanjeev mk    schedule 26.12.2013
comment
Спасибо, что поделились этой жемчужиной, Ура - person Jatin Dhoot; 30.04.2014