56 lines
2.0 KiB
JavaScript
56 lines
2.0 KiB
JavaScript
import { Image, Platform } from 'react-native';
|
||
import RNFS from 'react-native-fs';
|
||
import { ensurePngFile, toPngFileName } from './pngImage';
|
||
/** 将 require() 资源解析为 PNG 本地路径(OpenCV / RNFS 可读) */
|
||
export async function resolveAssetPath(assetModule, cacheFileName) {
|
||
const pngCacheName = toPngFileName(cacheFileName);
|
||
const source = Image.resolveAssetSource(assetModule);
|
||
if (!source?.uri) {
|
||
throw new Error('Cannot resolve image resource');
|
||
}
|
||
const { uri } = source;
|
||
if (uri.startsWith('file://')) {
|
||
return ensurePngFile(uri, pngCacheName);
|
||
}
|
||
if (Platform.OS === 'ios' && uri.startsWith('/')) {
|
||
return ensurePngFile(uri, pngCacheName);
|
||
}
|
||
if (Platform.OS === 'ios' && uri.startsWith('/')) {
|
||
return ensurePngFile(uri, pngCacheName);
|
||
}
|
||
if (uri.startsWith('http://') || uri.startsWith('https://')) {
|
||
const tmpDest = `${RNFS.CachesDirectoryPath}/tmp_${Date.now()}_${pngCacheName}`;
|
||
const { statusCode } = await RNFS.downloadFile({
|
||
fromUrl: uri,
|
||
toFile: tmpDest,
|
||
}).promise;
|
||
if (statusCode !== 200) {
|
||
throw new Error(`Download resource failed: ${pngCacheName}`);
|
||
}
|
||
try {
|
||
return await ensurePngFile(tmpDest, pngCacheName);
|
||
}
|
||
finally {
|
||
if (await RNFS.exists(tmpDest)) {
|
||
await RNFS.unlink(tmpDest);
|
||
}
|
||
}
|
||
}
|
||
if (Platform.OS === 'android') {
|
||
const assetPath = uri
|
||
.replace('asset:/', '')
|
||
.replace('file:///android_asset/', '');
|
||
const tmpDest = `${RNFS.CachesDirectoryPath}/tmp_${Date.now()}_${pngCacheName}`;
|
||
await RNFS.copyFileAssets(assetPath, tmpDest);
|
||
try {
|
||
return await ensurePngFile(tmpDest, pngCacheName);
|
||
}
|
||
finally {
|
||
if (await RNFS.exists(tmpDest)) {
|
||
await RNFS.unlink(tmpDest);
|
||
}
|
||
}
|
||
}
|
||
return ensurePngFile(uri, pngCacheName);
|
||
}
|
||
//# sourceMappingURL=resolveAssetPath.js.map
|