Отклонение необработанного обещания: ImageSource.setNativeSource() ожидает экземпляр UIImage

Используя Nativescript + Angular, мы разрабатываем мобильное приложение, которое позволяет пользователям делать фотографии, а затем загружать фотографии на сервер. У этого приложения есть особые требования к соотношению сторон фотографий, поэтому мы пытаемся использовать API урожая () в плагине nativescript-bitmap-factory (часть nativescript-toolbox), чтобы обрезать фотографию после ее захвата. Это отлично работало на Android, но не работало на iOS с этой ошибкой: Отклонение необработанного обещания: метод ImageSource.setNativeSource() ожидает экземпляр UIImage. Вот фрагмент кода:

import * as BitmapFactory from "nativescript-bitmap-factory";

public cropImage(image : ImageSource) : ImageSource {
    let mutable = BitmapFactory.makeMutable(image);
    return BitmapFactory.asBitmap(mutable).dispose((bmp) => {
        let croppedImage = bmp.crop({x:10,y:10}, {width:300,height:300});
       console.log("Image cropped!")
       return croppedImage.toImageSource();
    });
}

Ошибка была выброшена в последней строке

croppedImage.toImageSource();

Я изучил код nativescript-bitmap-factory и понял, что API урожая () возвращает экземпляр CGImage (вместо UIImage, ожидаемого ImageSource). Согласно этой статье https://medium.com/@ranleung/uiimage-vs-ciimage-vs-cgimage-3db9d8b83d94 довольно просто преобразовать CGImage в UIImage в target-c. Я уже несколько дней пытаюсь понять, как преобразовать CGImage в UIImage в области Nativescript. Я сообщил об ошибке в наборе инструментов nativescript (см. https://github.com/mkloubert/nativescript-toolbox/issues/10) пару недель назад, но ответа не было. Могут ли эксперты Nativescript поделиться мыслями или советами о том, как это можно сделать? Разумно ли просить, чтобы Nativescript ImageSource был улучшен для поддержки CGImage?


person Puhong    schedule 14.08.2019    source источник


Ответы (1)


Вы можете использовать собственный метод для преобразования CGImage в UIImage

        let mutable = BitmapFactory.makeMutable(image);
        return BitmapFactory.asBitmap(mutable).dispose((bmp) => {
            let croppedImage = bmp.crop({ x: 10, y: 10 }, { width: 300, height: 300 });
            return isAndroid ? croppedImage.toImageSource() :
                fromNativeSource(UIImage.alloc().initWithCGImage(croppedImage.nativeObject));
        });

Пример игровой площадки

person Manoj    schedule 15.08.2019
comment
Маной, большое спасибо за быстрый ответ! Ваше решение сработало как шарм! - person Puhong; 15.08.2019