如何修复代号为One的iOS摄像机的旋转图像?

问题描述 投票:1回答:1

我已经编写了一个代码来打开图库并在CodenameOne中选择图像文件。在iOS上,它还可以捕获图像。当我在iOS上拍摄照片时,照片会旋转90°。当我从图库中选择照片时,它不会旋转。如何固定90°旋转?这是我打开图库的代码:

Display.getInstance().openGallery((evt) -> {
        if (evt != null && evt.getSource() != null) {
            String filePath = (String) evt.getSource();
            Image img = null;
            try {
                img = Image.createImage(filePath);
            } catch (IOException e) {
            }
            if (img != null) {
                img = img.scaledLargerRatio(IMAGE_WIDTH_FOR_UPLOAD, IMAGE_HEIGHT_FOR_UPLOAD);
                ImageHelper.saveToFileSystem("image" + ".jpg", img, null, null);
                base64Img = (String) ImageHelper.loadBase64FromFileSystem("image" + ".jpg");
                browser.execute("document.getElementById(\"" + QR_PHOTO_UPLOAD_IMG_ID + "\").setAttribute('src', '" + BASE64_PREFIX + base64Img + "');"
                        + " document.getElementById(\"" + QR_PHOTO_UPLOAD_INPUT_ID + "\").setAttribute('base64', '" + BASE64_PREFIX + base64Img + "');"
                        + "");
            }
        }
        photoGalleryOpened = false;
    }, Display.GALLERY_IMAGE);

这里是用于将图像保存到文件系统的代码:

public static boolean saveToFileSystem(String path, Image capturedImage, String format, Float quality) {
    if (format == null) {
        format = ImageIO.FORMAT_JPEG;
    }
    if (quality == null) {
        quality = 1f;
    }
    OutputStream os = null;
    try {
        String pathToBeStored = path.startsWith(APPHOMEPATH)?  path : (APPHOMEPATH + path);
        os = FileSystemStorage.getInstance().openOutputStream(pathToBeStored);
        ImageIO.getImageIO().save(capturedImage, os, format, quality);
        os.close();
    } catch (Exception e) {
        Log.e(e);
        try {
            if (os != null) {
                os.close();
            }
        } catch (IOException ex) {
            Log.e(ex);
        }
        return false;
    } finally {
        try {
            if (os != null) {
                os.close();
            }
        } catch (IOException ex) {
            Log.p(ex.getMessage());
        }
    }

    return true;
}

这里是用于从图像文件获取base64字符串的代码:

public static Object loadBase64FromFileSystem(String path) {
        String ret = "";
        try {
            Image image = loadFromFileSystem(path);
            if (image == null) {
                throw new IOException("File not found (" + APPHOMEPATH + path + ")");
            }
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            ImageIO.getImageIO().save(image, baos, ImageIO.FORMAT_JPEG, 1);
            byte[] bytes = baos.toByteArray();
            ret = Base64.encodeNoNewline(bytes);
        } catch (Exception ex) {
            Log.e(ex);
        }
        return ret;
    }

public static Image loadFromFileSystem(String path) {
       try {
           File f = new File(APPHOMEPATH + path);
           if(f.exists()){
               Log.p("Image exists: " + f.exists());
               Image img = Image.createImage(f.getPath());
               return img;
           }else{
                Log.p("Image doesn't exist");
               return null;
           }
       } catch (Exception ex) {
           Log.e(ex);
       }
       Log.p("Image doesn't exist");
       return null;
   }
codenameone
1个回答
0
投票

移动操作系统通常以一种方向拍照,然后在标签中将其标记为旋转,例如照片始终是风景照片,但是当您拍摄人像模式照片时,照片会标记为旋转90度。

这很正常,因为大多数应用读取标签并在加载后隐式旋转照片。在移动操作系统上,某些应用程序不支持,本机图像读取代码不支持。我们需要显式解析标签并进行轮换。我们这样做是为了捕获逻辑,但对于图像加载,我们通常不会这样做。

问题是旋转图像非常昂贵,并且每次加载图像都将花费很大(但在这种情况下可能是我们必须要做的)。现在,我能想到的唯一解决方法是手动解析图像标签,这会有些痛苦。

© www.soinside.com 2019 - 2024. All rights reserved.