我正在捕捉图像并将其设置为图像视图.
public void captureImage() {
Intent intentCamera = new Intent("android.media.action.IMAGE_CAPTURE");
File filePhoto = new File(Environment.getExternalStorageDirectory(), "Pic.jpg");
imageUri = Uri.fromFile(filePhoto);
MyApplicationGlobal.imageUri = imageUri.getPath();
intentCamera.putExtra(MediaStore.EXTRA_OUTPUT, imageUri);
startActivityForResult(intentCamera, TAKE_PICTURE);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent intentFromCamera) {
super.onActivityResult(requestCode, resultCode, intentFromCamera);
if (resultCode == RESULT_OK && requestCode == TAKE_PICTURE) {
if (intentFromCamera != null) {
Bundle extras = intentFromCamera.getExtras();
if (extras.containsKey("data")) {
bitmap = (Bitmap) extras.get("data");
}
else {
bitmap = getBitmapFromUri();
}
}
else {
bitmap = getBitmapFromUri();
}
// …
Run Code Online (Sandbox Code Playgroud) 我正在构建一个使用相机拍照的应用程序.这是我的源代码:
File file = new File(Environment.getExternalStorageDirectory(),
imageFileName);
imageFilePath = file.getPath();
Intent intent = new Intent("android.media.action.IMAGE_CAPTURE");
//Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
intent.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(file));
startActivityForResult(intent, ACTIVITY_NATIVE_CAMERA_AQUIRE);
Run Code Online (Sandbox Code Playgroud)
在onActivityResult()
方法上,我BitmapFactory.decodeStream()
用来拾取图像.
当我在Nexus上运行我的应用程序时,它运行良好.但是当我在三星Galaxy S或HTC Inspire 4G上运行时,图像的方向是不正确的.
拍摄后的图像预览--------- SD卡上的真实图像
拍摄后的图像预览--------- SD卡上的真实图像
如果您的Android应用使用设备的相机拍照,然后调整它的大小(这是很常见的,以减少上传大小),你可能没有意识到,这个调整操作条的EXIF元数据.
这可能会导致问题,尤其是当相关设备依赖"方向"标签正确显示图像时.
不同的Android设备以不同的方式处理相机/图像旋转 - 我信赖的'Nexus One似乎总是在捕获后立即旋转图像,因此文件的本机内容在查看时始终是"直立的".然而,其他设备(特别是我测试中的三星手机)不会旋转图像文件的内容 - 而是设置exif'Orientation'标签.无论何时稍后显示图像,相关图像代码都应检测到方向"标签"的存在并适当地旋转图像.但是如果您对图像进行了任何位图处理并将其保存到新文件中,那么所有exif数据都将丢失.
除了Orientation数据之外,您还可能会丢失其他有价值的元数据,例如品牌/型号等.
这使我困惑了几个星期(图像在电话库中显示时显示正常,但随后到达我的服务器时方向错误且没有明显的元数据).我在这里添加这个自我提问来帮助别人.这篇博客文章非常有用:
http://vikaskanani.wordpress.com/2011/07/17/android-re-size-image-without-loosing-exif-information/
我有一个纵向模式的相机应用程序,它从前端和后端相机拍摄照片.我将图像保存在我的SD卡中并尝试找到相应的exif值,它总是给出0.但是我得到了预期的exif方向存储在设备中的其他图像的值(如下载的图片).
我怎样才能解决这个问题 ?谁能帮我吗 ?
这是用于保存图片和查找方向的代码
PictureCallback myPictureCallback_JPG = new PictureCallback() {
@Override
public void onPictureTaken(byte[] arg0, Camera arg1) {
// TODO Auto-generated method stub
try {
File APP_FILE_PATH = new File(Environment.getExternalStorageDirectory()
.getPath() + "/Myapp/");
if (!APP_FILE_PATH.exists()) {
APP_FILE_PATH.mkdirs();
}
File file = new File(APP_FILE_PATH, "image.jpg");
FileOutputStream fos = new FileOutputStream(file);
fos.write(arg0);
fos.close();
imageFileUri=Uri.fromfile(file); getApplicationContext().getContentResolver().notifyChange(
imageFileUri, null);
sendBroadcast(new Intent(Intent.ACTION_MEDIA_MOUNTED,
Uri.parse("file://"
+ Environment.getExternalStorageDirectory())));
ExifInterface exif = new ExifInterface(file.getAbsolutePath());
int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);
} catch (Exception e) {
}
}
};
Run Code Online (Sandbox Code Playgroud)
以下是surphace创建和更改函数的代码 …
我已经浏览了一些链接,以获得从默认图库中选择的图像的正确图像方向,以便在exif标记始终返回0的所有设备中标准化.
对于使用肖像相机应用程序android拍摄的图像,EXIF方向标记值始终为0
http://mobisocial.stanford.edu/news/2011/08/rotating-images-in-android/
如何获得适用于所有设备的精确解决方案?
我从相机/画廊意图到我的应用程序的照片.在许多手机中,我从意图/ Uri中读取的图片已经旋转到正确的方向.例如N1,Legend,Desire就是这种情况.
但是在某些手机上(例如Milestone1,GalaxyS),无论拍摄图片的方式如何,图片总是在风景中.这意味着在我的应用程序中,纵向图片以错误的方式呈现给用户.我试图读取图片的EXIF信息,但方向标记始终为0.必须有一种方法可以找到图片的正确方向,因为在Milestone1中,图库应用程序正确显示肖像图片.
我如何知道在向用户展示之前是否需要自己旋转图片?
谢谢你的帮助!
我需要知道图库中图像的方向(由相机拍摄).我最初的方法是使用适用于我的Droid 1的MediaStore.Images.Media.ORIENTATION.在HTC Thunderbolt上测试时,手机只能将0保存到该字段.
然后我开始阅读exif数据:
ExifInterface exifReader = new ExifInterface(mFilePath);
exifReader.getAttributeInt(ExifInterface.TAG_ORIENTATION, -1);
Run Code Online (Sandbox Code Playgroud)
这也为每个图像返回0.任何人都有关于如何正确获取Android照片的方向的想法?
在Android中,您可以Camera
通过检索a来获取a 的属性的描述CameraInfo
.我对方向很感兴趣,如http://developer.android.com/reference/android/hardware/Camera.CameraInfo.html#orientation所述.
然而,文档似乎与我的所有四个设备的行为方式不一致,而且,我有第五个设备的消息,这个设备看起来固定不变.
特别是,文档说:
该值是摄像机图像需要顺时针旋转的角度,因此它在显示屏上以其自然方向正确显示....例如,假设设备具有自然高的屏幕.后置摄像头传感器安装在横向上.你在看屏幕.如果相机传感器的顶部以自然方向与屏幕的右边缘对齐,则值应为90.如果前置摄像头传感器的顶部与屏幕右侧对齐,则值应为是270.
但在所述示例中,相机图像相对于自然高的方向顺时针旋转90度,而不是相反.也就是说,顶部与设备右侧对齐的图像需要顺时针旋转270度才能与设备的顶部对齐.
至少,我的所有四个设备都会为此值报告"90",并且当保持在自然方向时,所有设备的行为都好像相机的顶部是设备的右侧.也就是说,图像必须顺时针旋转270度,而不是90度,以匹配自然方向.这个例子似乎是对的; 第一行没有.
这个示例代码似乎支持我的结论,因为它只在方向被解释为上面时才给出正确的结果.
奇怪的是,我有来自一个用户设备的记录证据,显示它有时报告该值为90,其他时间报告为0!它应该是相机如何坐在设备中的物理属性,对吧?
CameraInfo.orientation
?在文档中是否有证据证明这是合法行为,或者它可能是设备中的错误?我想简单地拍一张照片并用我的三星galaxy s在ImageView中呈现它.当我在风景上而不是在肖像上做它时工作正常.我没有得到任何错误或异常 - 只是没有得到任何东西......有很多关于这个主题的问题,它似乎有问题(关于相机方向的东西),但不能找出一个简单的最终解决方案"拍照并呈现"代码.这是我的(有问题的)代码不起作用:
private void setUpListeners() {
takePicture.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
Intent cameraIntent = new Intent(
android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, CAMERA_PIC_REQUEST);
}
});
}
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == RESULT_OK) {
if (requestCode == CAMERA_PIC_REQUEST) {
Log.d("onActivityResult", "CAMERA_PIC_REQUEST returned");
dishImage = (Bitmap) data.getExtras().get("data");
if (dishImage==null)
Log.d("onActivityResult", "dishImage==null");
imageView = (ImageView) findViewById(R.id.dishinfodishimageview);
imageView.setImageBitmap(dishImage);
imageView.setVisibility(View.VISIBLE);
takePicture.setVisibility(View.GONE);
(new UploadImage()).execute(null);
}
} else {
Log.e("onActivityResult",
"no able to …
Run Code Online (Sandbox Code Playgroud) 照片旋转90度,同时从三星移动其他手机(HTC)的相机捕捉其工作正常.请帮帮我.
Intent cameraIntent = new Intent(android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
startActivityForResult(cameraIntent, IMAGE_CAPTURE);
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
try
{
if (requestCode == IMAGE_CAPTURE) {
if (resultCode == RESULT_OK){
Uri contentUri = data.getData();
if(contentUri!=null)
{
String[] proj = { MediaStore.Images.Media.DATA };
Cursor cursor = managedQuery(contentUri, proj, null, null, null);
int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
cursor.moveToFirst();
imageUri = Uri.parse(cursor.getString(column_index));
}
tempBitmap = (Bitmap) data.getExtras().get("data");
mainImageView.setImageBitmap(tempBitmap);
isCaptureFromCamera = true;
}
}
Run Code Online (Sandbox Code Playgroud) 从我的库中选择图像时,我无法获得方向.如果我转到图像细节,我可以看到图像方向设置为90度.但是,我的方向始终为0.
String[] orientationColumn = { MediaStore.Images.ImageColumns.ORIENTATION };
Cursor cur = managedQuery(data.getData(), orientationColumn, null, null, null);
int orientation = -1;
if (cur != null && cur.moveToFirst()) {
orientation = cur.getInt(cur.getColumnIndex(orientationColumn[0]));
}
Run Code Online (Sandbox Code Playgroud)
使用ExitInterface:
ExifInterface exif = new ExifInterface(data.getData().getPath());
int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION);
Run Code Online (Sandbox Code Playgroud)
两种方式都返回0.我从库启动select活动,如下所示:
protected void selectFromLibrary() {
Intent intent = new Intent(Intent.ACTION_PICK);
intent.setAction(Intent.ACTION_GET_CONTENT);
intent.setData(MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
intent.setType("image/*");
startActivityForResult(intent,
REQUEST_SELECT_IMAGE_FILE);
}
Run Code Online (Sandbox Code Playgroud)
这是在运行4.4.2的LG G2上