mirror of
https://github.com/NativeScript/NativeScript.git
synced 2025-11-05 13:26:48 +08:00
105 lines
2.6 KiB
TypeScript
105 lines
2.6 KiB
TypeScript
import { ImageAssetBase, getRequestedImageSize } from "./image-asset-common";
|
|
import { path as fsPath, knownFolders } from "../file-system";
|
|
|
|
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;
|
|
}
|
|
}
|
|
|
|
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.");
|
|
}
|
|
|
|
let srcWidth = this.nativeImage
|
|
? this.nativeImage.size.width
|
|
: this.ios.pixelWidth;
|
|
let srcHeight = this.nativeImage
|
|
? this.nativeImage.size.height
|
|
: this.ios.pixelHeight;
|
|
let requestedSize = getRequestedImageSize(
|
|
{ width: srcWidth, height: srcHeight },
|
|
this.options
|
|
);
|
|
|
|
if (this.nativeImage) {
|
|
let newSize = CGSizeMake(requestedSize.width, requestedSize.height);
|
|
let resizedImage = this.scaleImage(this.nativeImage, newSize);
|
|
callback(resizedImage, null);
|
|
|
|
return;
|
|
}
|
|
|
|
let imageRequestOptions = PHImageRequestOptions.alloc().init();
|
|
imageRequestOptions.deliveryMode =
|
|
PHImageRequestOptionsDeliveryMode.HighQualityFormat;
|
|
imageRequestOptions.networkAccessAllowed = true;
|
|
|
|
PHImageManager.defaultManager().requestImageForAssetTargetSizeContentModeOptionsResultHandler(
|
|
this.ios,
|
|
requestedSize,
|
|
PHImageContentMode.AspectFit,
|
|
imageRequestOptions,
|
|
(image, imageResultInfo) => {
|
|
if (image) {
|
|
let resultImage = this.scaleImage(image, requestedSize);
|
|
callback(resultImage, null);
|
|
} else {
|
|
callback(
|
|
null,
|
|
imageResultInfo.valueForKey(PHImageErrorKey)
|
|
);
|
|
}
|
|
}
|
|
);
|
|
}
|
|
|
|
private scaleImage(
|
|
image: UIImage,
|
|
requestedSize: { width: number; height: number }
|
|
): UIImage {
|
|
// scaleFactor = 0 takes the scale factor of the devices's main screen.
|
|
const scaleFactor =
|
|
this.options && this.options.autoScaleFactor === false ? 1.0 : 0.0;
|
|
|
|
UIGraphicsBeginImageContextWithOptions(
|
|
requestedSize,
|
|
false,
|
|
scaleFactor
|
|
);
|
|
image.drawInRect(
|
|
CGRectMake(0, 0, requestedSize.width, requestedSize.height)
|
|
);
|
|
let resultImage = UIGraphicsGetImageFromCurrentImageContext();
|
|
UIGraphicsEndImageContext();
|
|
|
|
return resultImage;
|
|
}
|
|
}
|