
Большинство разработчиков 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 ~ Сделайте снимок и используйте его для сжатия, кадрирования или получения уменьшенного изображения.
Для этого варианта использования доступно множество модулей, чтобы исправить это. Вот несколько:
- Http://www.tidev.io/2014/01/23/fixing-orientation-when-resizing-images-on-android/
- Https://github.com/ricardoalcocer/AndroidRotateImage
- Https://github.com/skypanther/TiRotate
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;
}
Вот и все по этому вопросу. Простое встроенное исправление и больше никаких головных болей и сюрпризов при превращении портретного изображения в альбомный. Надеюсь, моя первая статья здесь поможет кому-то, кто в ней нуждается. :)
Предложения приветствуются!