reading android jpeg EXIF metadata from picture callback

前端 未结 8 1816
天命终不由人
天命终不由人 2020-11-30 20:48

Background: I am writing a camera app for a messenger program. I cannot save the captured image to persistent disk at any time. The camera must support all orientations.

8条回答
  •  离开以前
    2020-11-30 21:26

    To read metadata/EXIF from image byte[] (useful for Camera.takePicture()) using version 2.9.1 of the metadata extraction library in Java by Drew Noakes:

    try
    {
        // Extract metadata.
        Metadata metadata = ImageMetadataReader.readMetadata(new BufferedInputStream(new ByteArrayInputStream(imageData)), imageData.length);
    
        // Log each directory.
        for(Directory directory : metadata.getDirectories())
        {
            Log.d("LOG", "Directory: " + directory.getName());
    
            // Log all errors.
            for(String error : directory.getErrors())
            {
                Log.d("LOG", "> error: " + error);
            }
    
            // Log all tags.
            for(Tag tag : directory.getTags())
            {
                Log.d("LOG", "> tag: " + tag.getTagName() + " = " + tag.getDescription());
            }
        }
    }
    catch(Exception e)
    {
        // TODO: handle exception
    }
    

    To read the EXIF orientation of the image (not the orientation of the thumbnail):

    try
    {
        // Get the EXIF orientation.
        final ExifIFD0Directory exifIFD0Directory = metadata.getFirstDirectoryOfType(ExifIFD0Directory.class);
        if(exifIFD0Directory.containsTag(ExifIFD0Directory.TAG_ORIENTATION))
        {
            final int exifOrientation = exifIFD0Directory.getInt(ExifIFD0Directory.TAG_ORIENTATION);
    
            /* Work on exifOrientation */
        }
        else
        {
            /* Not found */
        }
    }
    catch(Exception e)
    {
        // TODO: handle exception
    }
    

    The orientation is from 1 to 8. See here, here, here or here.


    To transform a bitmap based on its EXIF orientation:

    try
    {
        final Matrix bitmapMatrix = new Matrix();
        switch(exifOrientation)
        {
            case 1:                                                                                     break;  // top left
            case 2:                                                 bitmapMatrix.postScale(-1, 1);      break;  // top right
            case 3:         bitmapMatrix.postRotate(180);                                               break;  // bottom right
            case 4:         bitmapMatrix.postRotate(180);           bitmapMatrix.postScale(-1, 1);      break;  // bottom left
            case 5:         bitmapMatrix.postRotate(90);            bitmapMatrix.postScale(-1, 1);      break;  // left top
            case 6:         bitmapMatrix.postRotate(90);                                                break;  // right top
            case 7:         bitmapMatrix.postRotate(270);           bitmapMatrix.postScale(-1, 1);      break;  // right bottom
            case 8:         bitmapMatrix.postRotate(270);                                               break;  // left bottom
            default:                                                                                    break;  // Unknown
        }
    
        // Create new bitmap.
        final Bitmap transformedBitmap = Bitmap.createBitmap(imageBitmap, 0, 0, imageBitmap.getWidth(), imageBitmap.getHeight(), bitmapMatrix, false);
    }
    catch(Exception e)
    {
        // TODO: handle exception
    }
    

提交回复
热议问题