`

图片的orientation属性

 
阅读更多
由相机或者手持设备拍出来的图片,由于设备拍摄的角度的不同,会导致图片上传到应用程序时,图片的角度会被自动旋转。而导致图片的角度不对。

特此做了一些调查,一般由相机等手持设备拍出来的相片的默认后缀是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;
}


以上仅为个人学习调查得知,不足之处欢迎大家补充!
分享到:
评论

相关推荐

    PHP 中 Orientation 属性判断上传图片是否需要旋转

    需要注意的是,本文还提到,Android系统拍照生成的图片Orientation属性通常都是1,意味着Android设备拍摄的图片不会记录错误的方向信息。因此,在此情况下,即便图片是倒置的,也无法通过Orientation属性进行识别和...

    test-exiforientation.rar

    标题中的“test-exiforientation.rar”是一个压缩包文件,它很可能包含了多个图片文件,用于演示或测试EXIF(Exchangeable Image File Format)中的“Orientation”属性。EXIF是一种存储在数码图像文件中的元数据,...

    利用exif.is 对拍照的图片进行自动校正并下载

    // 根据orientation属性校正图片 Exif.fixOrientation(file, function(newFile) { // 创建预览元素 const img = document.createElement('img'); img.src = URL.createObjectURL(newFile); // 创建下载链接 ...

    vb属性窗口属性设置大全.docx

    由于控件长度单位为像素,与图片框或图像控件的默认单位(缇)不同,可能需要调整ScaleMode属性以保持一致。 接下来,我们转向ProgressBar控件,它用于显示进度条,常用于反馈任务执行的进度。 1. Name:自定义...

    ListBox中显示图片

    `Width`和`Height`属性定义了图片的显示大小,`Stretch`属性确保图片按比例填充整个图像区域。 4. **加载图片**:根据你的数据源类型,你可能需要将图片路径或URL转换为`ImageSource`。如果你的数据源是图片路径,...

    android.R.styleable 类包含 XML属性

    android:orientation 属性用于设置控件的排布方式,可以设置为 horizontal 或 vertical。 * android:orientation="horizontal" // 设置控件排布为水平方向 * android:orientation="vertical" // 设置控件排布为垂直...

    WPF上传图片、文件、提示图片信息

    这里,我们使用了数据绑定将Image控件的Source属性绑定到ListBoxItem的数据项(即BitmapImage对象),并且保留了之前设置的Tooltip。 5. **优化性能**: 对于大量图片,我们应该考虑性能优化。可以使用...

    android图片翻转动画

    考虑到Android设备的广泛性,我们通常会使用属性动画来实现3D图片翻转,以便支持更多的设备。 在实现3D翻转动画之前,我们需要创建一个ImageView来展示图片,并准备好两张图片,一张是翻转前的图片,另一张是翻转后...

    android 自定义控件 自定义属性详细介绍

    1. **reference**: 这种类型用于引用已存在的资源ID,如颜色、图片等。例如: ```xml ``` 2. **color**: 定义颜色值,可以是预定义的颜色或者RGB十六进制值。例如: ```xml ``` 3. **boolean**: 表示...

    简单图片浏览器

    通过设置LinearLayout的orientation属性,开发者可以选择图片是横向还是纵向切换。 为了实现点击切换图片的功能,开发者需要编写对应的点击事件监听器。在Java代码中,这通常涉及到对ImageView设置OnClickListener...

    webupload上传照片,获得照片旋转角度,提交后台进行旋转

    webupload上传照片,前台获得照片的exif信息中的orientation属性的值,提交后台进行旋转

    Android:解决RadioGroup中RadioButton的图片自定义及每项间隔距离一样

    至于RadioGroup中的RadioButton间隔问题,我们可以通过设置RadioGroup的android:orientation属性为“vertical”或“horizontal”来控制布局方向,然后利用android:layout_margin属性来调整每个RadioButton之间的间距...

    Android全屏图片显示

    创建一个全屏布局,通常使用`android.widget.RelativeLayout`或`androidx.constraintlayout.widget.ConstraintLayout`作为根布局,并设置其填充父布局的属性: ```xml android:layout_width="match_parent" ...

    WPF 图片轮播 2D 3D

    通过设置`ItemsControl.VirtualizingStackPanel.IsVirtualizing`属性为`True`,WPF只会在可视区域内加载必要的项,从而提高性能。 ### 结论 WPF提供了强大的2D和3D图形能力,使我们能够轻松创建出具有丰富视觉效果...

    wpf通过鼠标滚轮控制图片缩放通过鼠标来移动还原图片

    <StackPanel Orientation="Horizontal"> 放大" /> 缩小" /> 翻转" /> <!-- 其他菜单项... --> ``` 以上就是关于“wpf通过鼠标滚轮控制图片缩放,通过鼠标来移动图片,以及透明菜单栏”的详细解释。通过这些...

    android图片缩放,边界回弹,旋转,拖动,双击,单击,自动旋转摆正,图片居中显示

    如果需要自动旋转摆正,通常是在图片加载后检测其EXIF信息,根据其中的Orientation字段来决定是否需要调整图片的方向。 拖动图片则是通过监听MotionEvent,获取用户的触摸位置,并根据触摸点与图片中心点的偏移量,...

    android 多行显示文本及图片

    例如,如果希望图片在文本前面,可以在`LinearLayout`中设置`orientation`为`vertical`,然后将`ImageView`作为第一个子元素,接着是`TextView`。如果希望图片在文本后面,只需将它们的顺序交换即可。对于`...

Global site tag (gtag.js) - Google Analytics