圖片的 orientation 屬性

轉載自:

https://baiyunliu.iteye.com/blog/2067000 


由相機或者手持設備拍出來的圖片,由於設備拍攝的角度的不同,會導致圖片上傳到應用程序時,圖片的角度會被自動旋轉。而導致圖片的角度不對。

特此做了一些調查,一般由相機等手持設備拍出來的相片的默認後綴是jpg,這類圖片自身有一些屬性如方向屬性Orientation,在我們的應用程序裏可以被獲取(PNG這類圖片是沒有這類信息的),來供我們做一些處理。

orientation的幾種類型:
Orientation = 1(不翻轉)
Orientation = 2 (左右翻轉)
Orientation = 3 (180度翻轉
Orientation = 4 (上下翻轉)
Orientation = 5 (順時針翻轉90度後,左右翻轉)
Orientation = 6 (順時針翻轉90度)
Orientation = 7 (逆時針翻轉90度後,左右翻轉)
Orientation = 8 (逆時針翻轉90度)

PS:一般常用的也就是1,3,6,8,另外幾種,反正我是沒有拍出這種orientation的圖片,應該是那種有特效功能的相機拍出的吧。

由以上可知,如果orientation!=1時,需要對圖片進行適當的旋轉,這樣才能得到拍攝時圖片的樣子。

獲取Orientation屬性需要通過第三方的jar包
https://code.google.com/p/metadata-extractor/
以下我使用了metadata-extractor-2.6.4.jar

Metadata metaData = null;
            boolean isExif = true;
            try {
                metaData = ImageMetadataReader.readMetadata(inBuffer, false);
            } catch (IOException io) {
                throw io;
            } catch (Throwable e) {
                isExif = false;
            }

            int orientation = 0;
            if (isExif) {
                if (metaData != null) {
                    Directory directory = metaData
                            .getDirectory(ExifIFD0Directory.class);
                    try {
                        if (directory != null) {
                            orientation = directory
                                    .getInt(ExifIFD0Directory.TAG_ORIENTATION);
                        } else {
                            orientation = 1;
                        }
                    } catch (MetadataException e) {
                        orientation = 1;
                    }
                } else {
                    orientation = 1;
                }
            }


PS:以上測試時發現,安卓系統拍出來的圖片是得不到orientation信息的,因爲不管以什麼角度拍攝的圖片,上傳到應用程序時,角度都是正確的,不要我們自己去旋轉。而蘋果系統就不太一樣了。它需要我們手動去旋轉。


得到了orientation屬性後,需要根據以上orientation信息,做相應的旋轉:
這裏有使用了另外一個第三方jar包(其實實現的方法有好幾種,但是我只試了兩個)
thumbnailator-0.4.7.jar和imgscalr-lib-4.2.jar

使用thumbnailator-0.4.7.jar雖然旋轉成功了,但是圖片有些失真,所以用了imgscalr-lib-4.2.jar
switch (orientation) {
                case ORIENTATION_1:
                    orgImage = orgImageSrc;
                    break;
                case ORIENTATION_3:
                    orgImage = Scalr.rotate(orgImageSrc, Scalr.Rotation.CW_180,
                            Scalr.OP_ANTIALIAS);
                    break;
                case ORIENTATION_6:
                    orgImage = Scalr.rotate(orgImageSrc, Scalr.Rotation.CW_90,
                            Scalr.OP_ANTIALIAS);
                    break;
                case ORIENTATION_8:
                    orgImage = Scalr.rotate(orgImageSrc, Scalr.Rotation.CW_270,
                            Scalr.OP_ANTIALIAS);
                    break;
                default:
                    orgImage = orgImageSrc;
                    break;
                }

thumbnailator-0.4.7.jar方式
BufferedImage orgImageSrc = ImageIO.read(inputStream);
switch (orientation) {
case 1:
orgImage = orgImageSrc;
break;
case 3:
orgImage = Scalr.rotate(orgImageSrc, Scalr.Rotation.CW_180,

// orgImage = Rotation.ROTATE_180_DEGREES.apply(orgImageSrc);

break;
case 6:
// orgImage =
// Thumbnails.of(orgImageSrc).scale(1).rotate(-90).asBufferedImage();
orgImage = Scalr.rotate(orgImageSrc, Scalr.Rotation.CW_90,

break;
case 8:
orgImage = Scalr.rotate(orgImageSrc, Scalr.Rotation.CW_270,

// orgImage =
// Thumbnails.of(orgImageSrc).scale(1).rotate(90).asBufferedImage();
break;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章