Большинство разработчиков Titanium хорошо осведомлены о проблеме, которая автоматически переводит портретные изображения, сделанные камерой, в альбомный режим на некоторых устройствах Android.

Это действительно сводит разработчиков с ума, когда они видят эту проблему в первый раз, и тогда это может тратить их драгоценное время. Некоторые устройства Android или, точнее, модели / производители устройств, которые имеют большое значение для пользовательского пространства вашего приложения, имеют эту проблему, поэтому она может возникнуть или не произойти на всех устройствах Android.

Прежде чем продолжить, я хотел бы пояснить тот факт, что на самом деле это проблема не Titanium, она также возникает в родном Android.

Недавно, работая над кроссплатформенным приложением, я столкнулся с этой странной проблемой (которая на самом деле была связана с устройством, которое я использовал для этого приложения), и, к счастью, я обнаружил, что у Titanium есть множество решений для решения этой проблемы, и это зависит от вашего приложения. вариант использования, какое решение подходит вам лучше всего.

Давайте посмотрим на следующие 2 сценария использования и их решения для изображений, сделанных из галереи или камеры устройства:

1 ~ Просто покажите изображение в Ti.UI.ImageView и забудьте о дальнейшем использовании этого изображения.

  • Ti.UI.ImageView имеет свойство, называемое autorotate, просто установите для этого свойства значение true, и вы все хорошо.
  • Примечание. Я также заметил, что установка этого свойства может работать или не работать при использовании Alloy, но всегда работает с Titanium Classic следующим образом:
var im = Ti.UI.createImageView({
    image : e.media,
    autorotate : true
});
    
$.IMAGE_PARENT_VIEW.add(im);

2 ~ Сделайте снимок и используйте его для сжатия, кадрирования или получения уменьшенного изображения.

Для этого варианта использования доступно множество модулей, чтобы исправить это. Вот несколько:

F или вышеупомянутые модули, возможно, вы получите только мультимедийный двоичный объект вместо файлового объекта, содержащего ваше изображение, что может ограничить вас в дальнейшем использовании изображения для другой обработки, такой как ручная обрезка (если вам нужно прямо обрезанное изображение) с помощью этого модуля: https://github.com/hyperlab/TiImageCropper.

S o это окончательное и простейшее решение для всех сценариев, которое работает без каких-либо сторонних модулей или каких-либо зависимостей.

function cameraGallerySuccessCB(e) {
    var finalImageFile = fixImage(e.media);
    
    // now you can use this image to show it in image view
    $.IMAGE_VIEW.image = finalImageFile.read();
    // OR you can pass it to some crop-module like below
    require('se.hyperlab.imagecropper').open({
         image : finalImageFile.read(),
         cancel : function(ex) {},
         error : function(ex) {},
         success : function(ex) {
             $.IMAGE_VIEW.image = finalImageFile.read();
         }
     });
}
function fixImage(media) {
    // this is where magic happens using in-built method of Ti.Blob
    var correctOrientationPic = media.imageAsResized(media.width, media.height);
var tempFile = Ti.Filesystem.getFile(Ti.Filesystem.tempDirectory, 'temp_profile.jpg');
    tempFile.write(correctOrientationPic);
    
    correctOrientationPic = null;
    return tempFile;
}

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

Предложения приветствуются!