如何检索缩略图旋转

我正在创建一种“图库”应用程序,它在网格中显示所有图像。

问题是:某些图像没有以正确的方向显示。

这是检索缩略图的代码

final String[] projection = { MediaStore.Images.Thumbnails.DATA, MediaStore.Images.Thumbnails.IMAGE_ID }; //query the thumbnails provider Cursor thumbnailsCursor = context.getContentResolver().query(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, projection, null, null, null); if (thumbnailsCursor.moveToFirst()) { do { //get the thumbnail path fullPath = thumbnailsCursor.getString(fullPathColumnIndex); thumbnailUri = Uri.parse(fullPath); //add the uri to the list thumbnailsList.add(thumbnailUri); } while (thumbnailsCursor.moveToNext()); thumbnailsCursor.close(); 

BaseAdaptergetView()内部我使用Picasso图像加载器库来显示缩略图,但有时候方向是错误的。

 Picasso.with(context).load(new File(photoItem.thumbnail.getPath())).noFade().into(holder.photoImageView); 

我已经尝试查询真实的照片数据并检索方向,但过程太慢(几秒钟)并且显示的图像太大。

给定图像的ID,您可以查询MediaStore以获取原始图像的路径,然后从那里获取取向的exif。

这个过程非常快,通常只需要几毫秒。

  Cursor cursor = CustomApplication .getContext() .getContentResolver() .query(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, new String[] {MediaStore.Images.Media.DATA}, MediaStore.Images.Media._ID + "=?", new String[] {"" + PHOTO_ID}, null); if (cursor != null && cursor.getCount() > 0) { cursor.moveToFirst(); String fullPath = cursor.getString(0); cursor.close(); ExifInterface exif = new ExifInterface(fullPath); int exifOrientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); //ROTATE AND FLIP YOUR THUMBNAIL AS NEEDED BASED ON exifOrientation } 

您可以使用ExifInterface类,如下所示:

 int originalOrientation = ExifInterface.ORIENTATION_NORMAL; try { ExifInterface exif = new ExifInterface(photoItem.thumbnail.getPath().toString()); originalOrientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1); } catch (IOException e) { e.printStackTrace(); } 

然后你可以检查它是否被旋转并做你需要的任何逻辑(例如将旋转角度传递给毕加索请求)。

 if (originalOrientation == ExifInterface.ORIENTATION_ROTATE_90 || originalOrientation == ExifInterface.ORIENTATION_ROTATE_270) { //do something } 

这是我使用的方法,我从未注意到任何性能影响。

我发现你可以在picasso lib中为你的加载任务应用自定义转换。

这是解决方案参考。

在那里变换方法使用MATRIX与其他已经给出了相同的..

我还没检查过。

这是正确的解决方案。 您可以从MediaStore查询方向数据,因此请使用MediaStore.Images.Media.ORIENTATION来获取方向度。

  final String[] projection = { MediaStore.Images.Thumbnails.DATA, MediaStore.Images.Thumbnails.IMAGE_ID, MediaStore.Images.Media.ORIENTATION }; Cursor thumbnailsCursor = context.getContentResolver().query(MediaStore.Images.Thumbnails.EXTERNAL_CONTENT_URI, projection, null, null, null); if (thumbnailsCursor.moveToFirst()) { do { int orientationColumnIndex = thumbnailsCursor.getColumnIndex(MediaStore.Images.Media.ORIENTATION); int orientation = cur.getInt(orientationColumnIndex); //do what you want to do with orientation value }while (thumbnailsCursor.moveToNext()); thumbnailsCursor.close(); 

会给你学位的方向。

 public static float getOrientationValue(String location) { ExifInterface exif = null; try { exif = new ExifInterface(new File(location).getAbsolutePath()); } catch (IOException e) { e.printStackTrace(); } int orientation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL); int rotate = 0; switch (orientation) { case ExifInterface.ORIENTATION_ROTATE_270: rotate += 90; case ExifInterface.ORIENTATION_ROTATE_180: rotate += 90; case ExifInterface.ORIENTATION_ROTATE_90: rotate += 90; } return rotate; } 

要么

  public static int getOrientation(Context context, Uri photoUri) { /* it's on the external media. */ Cursor cursor = context.getContentResolver().query(photoUri, new String[] { MediaStore.Images.ImageColumns.ORIENTATION }, null, null, null); if (cursor.getCount() != 1) { return -1; } cursor.moveToFirst(); return cursor.getInt(0); }