| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140 |
- var isString = function (value) {
- return typeof value === 'string';
- };
- var isNumber = function (value) {
- return typeof value === 'number';
- };
- var getFileExt = function (src) {
- var fileUrl = src.split('?')[0];
- var splitUlr = fileUrl.split('/');
- var filepath = splitUlr[splitUlr.length - 1];
- return filepath.split('.')[1] || 'jpg';
- };
- function isUrl(url) {
- // NOCC:ToolNameCheck(非敏感词)
- var urlReg = getRegExp(
- '/[(http(s)?)://(www.)?a-zA-Z0-9@:%._+~#=]{2,256}.[a-z]{2,6}\b([-a-zA-Z0-9@:%_+.~#?&//=]*)/',
- 'ig',
- );
- return urlReg.test(url);
- }
- function rpx2px(rpx, screenWidth) {
- // px / systemWidth = rpx / 750
- var result = (rpx * (screenWidth || 375)) / 750;
- return Math.round(result);
- }
- function imageMogr(url, options) {
- if (!isString(url) || !url) return '';
- if (
- url.indexOf('qlogo.cn') !== -1 ||
- url.indexOf('wxfile://') === 0 ||
- url.indexOf('http://tmp/wx') === 0 ||
- url.indexOf('imageMogr2') !== -1
- ) {
- //qlogo.cn域名或者本地图片不做转换
- return url;
- } //强制转https
- if (url.indexOf('http://') === 0) {
- url = url.replace('http://', 'https://');
- } else if (url.indexOf('//') === 0) {
- url = 'https:' + url;
- }
- if (!options) return url;
- var width = Math.ceil(options.width),
- height = Math.ceil(options.height),
- format = options.format,
- _optionsQuality = options.quality,
- quality = _optionsQuality === undefined ? 70 : _optionsQuality,
- _optionsStrip = options.strip,
- strip = _optionsStrip === undefined ? true : _optionsStrip,
- crop = options.crop;
- var isValidWidth = isNumber(width) && width > 0;
- var isValidHeight = isNumber(height) && height > 0;
- var imageMogrStr = '';
- var size = '';
- if (isValidWidth && isValidHeight) {
- size = ''.concat(width, 'x').concat(height);
- } else if (isValidWidth) {
- size = ''.concat(width, 'x');
- } else if (isValidHeight) {
- size = 'x'.concat(height);
- }
- if (size) {
- //缩放或者裁剪
- imageMogrStr += '/'.concat(crop ? 'crop' : 'thumbnail', '/').concat(size);
- if (crop) {
- //裁剪目前需求只有以图片中心为基准
- imageMogrStr += '/gravity/center';
- }
- }
- if (isNumber(quality)) {
- //质量变换
- imageMogrStr += '/quality/'.concat(quality);
- }
- if (strip) {
- //去除元信息
- imageMogrStr += '/strip';
- }
- var ext = getFileExt(url);
- // gif 图片不做格式转换,否则会损坏动图
- if (ext === 'gif') {
- imageMogrStr += '/cgif/1';
- } else if (format) {
- //格式转换
- imageMogrStr += '/format/'.concat(format);
- }
- if (format === 'jpg' || (!format && (ext === 'jpg' || ext === 'jpeg'))) {
- //渐进式 jpg 加载
- imageMogrStr += '/interlace/1';
- }
- if (!imageMogrStr) return url;
- return ''
- .concat(url)
- .concat(url.indexOf('?') !== -1 ? '&' : '?', 'imageMogr2')
- .concat(imageMogrStr);
- }
- function getSrc(options) {
- if (!options.src) return '';
- if (options.thumbWidth || options.thumbHeight) {
- return imageMogr(options.src, {
- width:
- options.mode !== 'heightFix'
- ? rpx2px(options.thumbWidth, options.systemInfo.screenWidth) *
- options.systemInfo.pixelRatio
- : null,
- height:
- options.mode !== 'widthFix'
- ? rpx2px(options.thumbHeight, options.systemInfo.screenWidth) *
- options.systemInfo.pixelRatio
- : null,
- format: options.webp ? 'webp' : null,
- });
- }
- return '';
- }
- module.exports = {
- imageMogr: imageMogr,
- getSrc: getSrc,
- };
|