Programing

Android는 카메라 비트 맵의 ​​방향을 얻습니까?

lottogame 2021. 1. 9. 09:19
반응형

Android는 카메라 비트 맵의 ​​방향을 얻습니까? 그리고 다시 -90도 회전


이 코드가 있습니다.

//choosed a picture
public void onActivityResult(int requestCode, int resultCode, Intent data) {

    if (resultCode == RESULT_OK) {
        if (requestCode == ImageHelper.SELECT_PICTURE) {

            String picture           = "";

            Uri selectedImageUri     = data.getData();
            //OI FILE Manager
            String filemanagerstring = selectedImageUri.getPath();
            //MEDIA GALLERY
            String selectedImagePath = ImageHelper.getPath(mycontext, selectedImageUri);

            picture=(selectedImagePath!=null)?selectedImagePath:filemanagerstring;

...

이것은 갤러리의 사진 선택 기일뿐입니다. 이것은 멋지지만이 사진을 imageview에서 열면 카메라로 "인물 모드"를 찍었을 때의 이미지가 멋져 보이지만 카메라로 "풍경 모드"를 찍은 이미지는 -90도에서 열립니다.

사진을 다시 회전하려면 어떻게해야합니까?

    Bitmap output       = Bitmap.createBitmap(newwidth, newheight, Config.ARGB_8888);
    Canvas canvas       = new Canvas(output);

나는 이것을 시도했다 :

Log.e("w h", bitmap.getWidth()+" "+bitmap.getHeight());
if (bitmap.getWidth()<bitmap.getHeight()) canvas.rotate(-90);

그러나 이것은 작동하지 않습니다. 모든 이미지 크기 : * 2560 1920 픽셀 (세로 및 LANDSCAPE 모드 모두)

LANDSCAPE 사진을 뒤로 회전하려면 어떻게해야합니까?

고마워 레슬리


디지털 카메라 나 스마트 폰으로 사진을 찍는 경우 회전은 종종 이미지 파일의 일부로 사진의 Exif 데이터에 저장 됩니다. Android를 사용하여 이미지의 Exif 메타 데이터를 읽을 수 있습니다 ExifInterface.

먼저 다음을 만듭니다 ExifInterface.

ExifInterface exif = new ExifInterface(uri.getPath());

다음으로 현재 회전을 찾습니다.

int rotation = exif.getAttributeInt(ExifInterface.TAG_ORIENTATION, ExifInterface.ORIENTATION_NORMAL);  

exif 회전을 각도로 변환 :

int rotationInDegrees = exifToDegrees(rotation);

어디

private static int exifToDegrees(int exifOrientation) {        
    if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_90) { return 90; } 
    else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_180) {  return 180; } 
    else if (exifOrientation == ExifInterface.ORIENTATION_ROTATE_270) {  return 270; }            
    return 0;    
 }

그런 다음 이미지의 실제 회전을 참조 점으로 사용하여 Matrix.

Matrix matrix = new Matrix();
if (rotation != 0) {matrix.preRotate(rotationInDegrees);}

a를 매개 변수로 사용하는 Bitmap.createBitmap방법을 사용하여 새 회전 된 이미지를 만듭니다 Matrix.

Bitmap.createBitmap(Bitmap source, int x, int y, int width, int height, Matrix m, boolean filter)

여기서 Matrix m새로운 회전을 원하는 분야

Bitmap adjustedBitmap = Bitmap.createBitmap(sourceBitmap, 0, 0, width, height, matrix, true);

유용한 소스 코드 예제는이 튜토리얼을 참조하십시오.


마지막 대답은 기술적으로 완벽했지만 그림을 관리하고, 회전하고, 크기를 조정하고, 캐시하고, ImageView에로드하는 시스템을 만들려고 노력했고, 이것이 지옥이라고 말할 수 있습니다. 모든 작업이 완료된 경우에도 충돌이 발생하여 일부 장치에서 OutOfMemory가 발생하는 경우가 있습니다.

My point is do not reinvent the wheel, it has a perfect design. Google itself encourage you to use Glide. It works in one line, super easy to use, lightweight in size and functions number, it manage EXIF by default, and it use memory like a charm.. It is simply black magic coded ;)

I'm not sure if Picasso also manages EXIF, but there is a quick intro to both of them:

https://inthecheesefactory.com/blog/get-to-know-glide-recommended-by-google/en

My Advice: do not waste your time and use them. You can solve your problem in one line:

Glide.with(context).load("http://i.imgur.com/DvpvklR.png").into(imageView);

ReferenceURL : https://stackoverflow.com/questions/7286714/android-get-orientation-of-a-camera-bitmap-and-rotate-back-90-degrees

반응형