由相机或者手持设备拍出来的图片,由于设备拍摄的角度的不同,会导致图片上传到应用程序时,图片的角度会被自动旋转。而导致图片的角度不对。
特此做了一些调查,一般由相机等手持设备拍出来的相片的默认后缀是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;
}
以上仅为个人学习调查得知,不足之处欢迎大家补充!
分享到:
相关推荐
需要注意的是,本文还提到,Android系统拍照生成的图片Orientation属性通常都是1,意味着Android设备拍摄的图片不会记录错误的方向信息。因此,在此情况下,即便图片是倒置的,也无法通过Orientation属性进行识别和...
标题中的“test-exiforientation.rar”是一个压缩包文件,它很可能包含了多个图片文件,用于演示或测试EXIF(Exchangeable Image File Format)中的“Orientation”属性。EXIF是一种存储在数码图像文件中的元数据,...
// 根据orientation属性校正图片 Exif.fixOrientation(file, function(newFile) { // 创建预览元素 const img = document.createElement('img'); img.src = URL.createObjectURL(newFile); // 创建下载链接 ...
由于控件长度单位为像素,与图片框或图像控件的默认单位(缇)不同,可能需要调整ScaleMode属性以保持一致。 接下来,我们转向ProgressBar控件,它用于显示进度条,常用于反馈任务执行的进度。 1. Name:自定义...
`Width`和`Height`属性定义了图片的显示大小,`Stretch`属性确保图片按比例填充整个图像区域。 4. **加载图片**:根据你的数据源类型,你可能需要将图片路径或URL转换为`ImageSource`。如果你的数据源是图片路径,...
android:orientation 属性用于设置控件的排布方式,可以设置为 horizontal 或 vertical。 * android:orientation="horizontal" // 设置控件排布为水平方向 * android:orientation="vertical" // 设置控件排布为垂直...
这里,我们使用了数据绑定将Image控件的Source属性绑定到ListBoxItem的数据项(即BitmapImage对象),并且保留了之前设置的Tooltip。 5. **优化性能**: 对于大量图片,我们应该考虑性能优化。可以使用...
考虑到Android设备的广泛性,我们通常会使用属性动画来实现3D图片翻转,以便支持更多的设备。 在实现3D翻转动画之前,我们需要创建一个ImageView来展示图片,并准备好两张图片,一张是翻转前的图片,另一张是翻转后...
1. **reference**: 这种类型用于引用已存在的资源ID,如颜色、图片等。例如: ```xml ``` 2. **color**: 定义颜色值,可以是预定义的颜色或者RGB十六进制值。例如: ```xml ``` 3. **boolean**: 表示...
通过设置LinearLayout的orientation属性,开发者可以选择图片是横向还是纵向切换。 为了实现点击切换图片的功能,开发者需要编写对应的点击事件监听器。在Java代码中,这通常涉及到对ImageView设置OnClickListener...
webupload上传照片,前台获得照片的exif信息中的orientation属性的值,提交后台进行旋转
至于RadioGroup中的RadioButton间隔问题,我们可以通过设置RadioGroup的android:orientation属性为“vertical”或“horizontal”来控制布局方向,然后利用android:layout_margin属性来调整每个RadioButton之间的间距...
创建一个全屏布局,通常使用`android.widget.RelativeLayout`或`androidx.constraintlayout.widget.ConstraintLayout`作为根布局,并设置其填充父布局的属性: ```xml android:layout_width="match_parent" ...
通过设置`ItemsControl.VirtualizingStackPanel.IsVirtualizing`属性为`True`,WPF只会在可视区域内加载必要的项,从而提高性能。 ### 结论 WPF提供了强大的2D和3D图形能力,使我们能够轻松创建出具有丰富视觉效果...
<StackPanel Orientation="Horizontal"> 放大" /> 缩小" /> 翻转" /> <!-- 其他菜单项... --> ``` 以上就是关于“wpf通过鼠标滚轮控制图片缩放,通过鼠标来移动图片,以及透明菜单栏”的详细解释。通过这些...
如果需要自动旋转摆正,通常是在图片加载后检测其EXIF信息,根据其中的Orientation字段来决定是否需要调整图片的方向。 拖动图片则是通过监听MotionEvent,获取用户的触摸位置,并根据触摸点与图片中心点的偏移量,...
例如,如果希望图片在文本前面,可以在`LinearLayout`中设置`orientation`为`vertical`,然后将`ImageView`作为第一个子元素,接着是`TextView`。如果希望图片在文本后面,只需将它们的顺序交换即可。对于`...