5

处理我们捕获图像并通过服务器上传的应用程序。应用程序在 Android 和 I Phone中。当我们从 Android 发布图像时,它们的数量以千字节为单位,但当我们从 I Phone 发布图像时,它们的大小为 MB。

当我们从 IPHONE 5 发布的带有 URL 的图像在浏览器上显示时,它们看起来不错,但是当我们在 Android 设备中下载该图像并在图像视图中显示时,它们看起来向左侧倾斜 90 度。

在 Android 或 I Phone 中下载图像后,我没有使用任何旋转代码。

在 I Phone 中,图像看起来很好。

从 Android 捕获的图像也可以直接看到。从 I Phone 捕获的低分辨率图像在 Android 中也可以直接看到。

从安卓上传的图片:

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

从我手机上传的图片:

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. 所以发布 1

2. 发布 2

于 2013-12-26T14:54:57.500 回答
2

该问题似乎与在图像上找到的EXIF数据有关。我们必须在显示图像之前对其进行处理。似乎不是每个相机都输出 EXIF 数据,因为这个问题只发生在一些安卓手机上。看看: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 回答