Как исправить повернутое изображение с камеры iOS в Codename One? - PullRequest
1 голос
/ 14 апреля 2020

Я написал код, чтобы открыть галерею и выбрать файл изображения в 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;
   }

1 Ответ

1 голос
/ 15 апреля 2020

Мобильные ОС часто делают фотографии с одной ориентацией, а затем просто помечают их как повернутые в теге, например, фотографии всегда в альбомной ориентации, но когда вы делаете фотографию в портретном режиме, она помечается как повернутая на 90 градусов.

Это прекрасно работает, так как большинство приложений читают теги и неявно поворачивают эту фотографию после загрузки. Некоторые приложения этого не делают, а собственный код для чтения изображений этого не делает в мобильных ОС. Нам нужно явно разобрать теги и сделать поворот. Мы делаем это для логики захвата c, но мы не делаем это в общем случае для загрузки изображения.

Проблема в том, что вращение изображения очень дорого, и делать это для каждой загрузки изображения будет дорого (но может будь что мы должны сделать в этом случае). Прямо сейчас единственный обходной путь, о котором я могу подумать, - это ручной анализ тегов изображения, что было бы немного болезненно.

...