nativescript-imagepicker: IOS: размер выбранного изображения отличается от исходного изображения [имеет решение] - PullRequest
0 голосов
/ 10 октября 2018

Изменения в решении будут включены в предстоящий выпуск 5.0.Пожалуйста, проверьте комментарий от команды nativescript-imagepicker: https://github.com/NativeScript/nativescript-imagepicker/issues/217

Спасибо за ваше время.


Размер выбранного изображения отличается от исходного изображения, какполучить исходный размер файла?

На какой платформе (ах) возникает ваша проблема?

  • эмулятор IOS 11.4 на iphone 8 Plus
  • реальное устройство IOS 11.4 на IPad air

Укажите следующие номера версий, с которыми возникает ваша проблема:

  • "nativescript-imagepicker": "6.0.4"

  • CLI: Nativescript 4.2.0

  • "tns-core-modules": "^ 4.2.1",

  • "tns-platform-декларации": "^ 3.3.0"

Плагин (ы):"devDependencies": {

  • "babel-traverse": "6.26.0",
  • "babel-types": "6.26.0",
  • "Вавилон": "6.18.0",
  • "Ленивый": "1.0.11",
  • "nativescript-dev-typcript": "0.7.2",
  • "машинопись": "~ 2.7.2"

}

Имеется ли какой-либо код?Здесь я использую @ код NevinDry :

исходное изображение составляет 2 МБ, и оно стало 20 МБ после 'imageSource.saveToFile (path1, "jpeg");'

pickFile() {
        let context = imagepickerModule.create({
            mediaType: 1,//image only
            mode: "single"
        });

        context
            .authorize()
            .then(function () {
                return context.present();
            })
            .then(selection => {
                selection.forEach(selected => {
                    let file;
                    fromAsset(selected).then((imageSource) => {
                        const folder = knownFolders.documents().path;
                        const fileName = "test.jpg";
                        const path1 = path.join(folder, fileName);
                        const saved = imageSource.saveToFile(path1, "jpeg");
                        console.log("saved:" + saved);
                        if (saved) {
                            console.log("Image saved successfully!");
                            file = File.fromPath(path1);
                            console.log("path1:" + path1);
                            this._checkFileSize(path1);
                        }
                    })
                });
            })
            .catch(function (e) {
                console.log(e);
            });
}

 private _checkFileSize(fileUri: string): boolean {
        if (isIOS) {
            var defManager = NSFileManager.defaultManager;
            console.debug("the file path:" + fileUri);
            var fileAttributes = defManager.attributesOfItemAtPathError(fileUri);
            console.debug(defManager);
            var fileSizeNumber = fileAttributes.objectForKey(NSFileSize);
            console.debug(fileSizeNumber);
            var fileSizeNumberB = fileSizeNumber / 1000000.0;
            console.debug("file size in Megabytes");
            console.debug(fileSizeNumberB);

            return true;
        }
    }

Я также попробовал следующее решение: изображение размером 2 МБ превращается в 6 МБ.Лучше, но не правильно.

Еще одна вещь может быть связана, 'imageSource.saveToFile (filePath, fileType);'исходный тип файла - jpg, поэтому я сохраняю fileType здесь как jpg.Если используется PNG, размер больше.

pickfile2(){
 let context = imagepickerModule.create({
            mediaType: 1,//image only
            mode: "single"
        });

        context
            .authorize()
            .then(function () {
                return context.present();
            })
            .then(selection => {
                selection.forEach(selected => {
                    const ios = selected.ios;
                    if (ios && ios.mediaType === PHAssetMediaType.Image) {
                        const opt = PHImageRequestOptions.new();
                        opt.version = PHImageRequestOptionsVersion.Current;
                        PHImageManager.defaultManager().requestImageDataForAssetOptionsResultHandler(
                            ios, opt, (imageData: NSData, dataUTI: string, orientation: UIImageOrientation, info: NSDictionary<any, any>) => {
                                console.debug(info.objectForKey("PHImageFileURLKey").toString());
                                let srcfilePath = info.objectForKey("PHImageFileURLKey").toString();
                                let fileName = this.extractImageName(srcfilePath);
                                let fileType: "png" | "jpeg" | "jpg" = this.extractImageType(fileName);
                                console.log("fileName:" + fileName);
                                console.log("srcfilePath:" + srcfilePath);
                                //get image instance from data; it doesn't work via 'fromPath'
                                let imageSource: ImageSource = <ImageSource>fromData(imageData);
                                let filePath = path.join(this.filePickerPath, fileName);
                                console.log("filePath:" + filePath);
                                let saved = imageSource.saveToFile(filePath, fileType);
                                console.log("saved:" + saved);
                                if (saved) {
                                    this._checkFileSize(filePath);
                                }
                            });
                    }
                });
            })
            .catch(function (e) {
                console.log(e);
            });
}

Код игровой площадки здесь

Страница перестала работать после добавления пакета npm 'tns-platform-декларации'от него.Поэтому, пожалуйста, загрузите его, если хотите запустить.Затем

  1. удалите версию папки nativescript-imagepicker@6.0.4
  2. переименуйте package1.json в package.json
  3. В файле reference.d.ts добавьтедобавление '/' перед '//', чтобы сделать его как '///' в двух строках.
  4. npm install.Это демо должно работать в вашей среде.

В любом случае, у кого-нибудь есть идеи?Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...