mirror of
				https://github.com/NativeScript/NativeScript.git
				synced 2025-11-04 12:58:38 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			67 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			2.2 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
	
	
import { ImageAssetBase, getRequestedImageSize } from './image-asset-common';
 | 
						|
import { path as fsPath, knownFolders } from '../file-system';
 | 
						|
import { queueGC } from '../utils';
 | 
						|
 | 
						|
export * from './image-asset-common';
 | 
						|
 | 
						|
export class ImageAsset extends ImageAssetBase {
 | 
						|
	private _ios: PHAsset;
 | 
						|
 | 
						|
	constructor(asset: string | PHAsset | UIImage) {
 | 
						|
		super();
 | 
						|
		if (typeof asset === 'string') {
 | 
						|
			if (asset.indexOf('~/') === 0) {
 | 
						|
				asset = fsPath.join(knownFolders.currentApp().path, asset.replace('~/', ''));
 | 
						|
			}
 | 
						|
 | 
						|
			this.nativeImage = UIImage.imageWithContentsOfFile(asset);
 | 
						|
		} else if (asset instanceof UIImage) {
 | 
						|
			this.nativeImage = asset;
 | 
						|
		} else {
 | 
						|
			this.ios = asset;
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	// @ts-ignore
 | 
						|
	get ios(): PHAsset {
 | 
						|
		return this._ios;
 | 
						|
	}
 | 
						|
 | 
						|
	set ios(value: PHAsset) {
 | 
						|
		this._ios = value;
 | 
						|
	}
 | 
						|
 | 
						|
	public getImageAsync(callback: (image, error) => void) {
 | 
						|
		if (!this.ios && !this.nativeImage) {
 | 
						|
			callback(null, 'Asset cannot be found.');
 | 
						|
		}
 | 
						|
 | 
						|
		const srcWidth = this.nativeImage ? this.nativeImage.size.width : this.ios.pixelWidth;
 | 
						|
		const srcHeight = this.nativeImage ? this.nativeImage.size.height : this.ios.pixelHeight;
 | 
						|
		const requestedSize = getRequestedImageSize({ width: srcWidth, height: srcHeight }, this.options);
 | 
						|
 | 
						|
		if (this.nativeImage) {
 | 
						|
			callback(this.scaleImage(this.nativeImage, CGSizeMake(requestedSize.width, requestedSize.height)), null);
 | 
						|
			queueGC();
 | 
						|
			return;
 | 
						|
		}
 | 
						|
 | 
						|
		const imageRequestOptions = PHImageRequestOptions.alloc().init();
 | 
						|
		imageRequestOptions.deliveryMode = PHImageRequestOptionsDeliveryMode.HighQualityFormat;
 | 
						|
		imageRequestOptions.networkAccessAllowed = true;
 | 
						|
 | 
						|
		PHImageManager.defaultManager().requestImageForAssetTargetSizeContentModeOptionsResultHandler(this.ios, requestedSize, PHImageContentMode.AspectFit, imageRequestOptions, (image, imageResultInfo) => {
 | 
						|
			if (image) {
 | 
						|
				callback(this.scaleImage(image, requestedSize), null);
 | 
						|
			} else {
 | 
						|
				callback(null, imageResultInfo.valueForKey(PHImageErrorKey));
 | 
						|
			}
 | 
						|
			queueGC();
 | 
						|
		});
 | 
						|
	}
 | 
						|
 | 
						|
	private scaleImage(image: UIImage, requestedSize: { width: number; height: number }): UIImage {
 | 
						|
		return NativeScriptUtils.scaleImageWidthHeightScaleFactor(image, requestedSize.width, requestedSize.height, this.options?.autoScaleFactor === false ? 1.0 : 0.0);
 | 
						|
	}
 | 
						|
}
 |