fcs
2025-04-10 0163870d662dc5b7d69ceff977490ede594f7d82
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
/*!
 * qn - lib/image.js
 * Copyright(c) 2013 fengmk2 <fengmk2@gmail.com> (http://fengmk2.github.com)
 * MIT Licensed
 */
 
"use strict";
 
/**
 * Module dependencies.
 */
 
var utility = require('utility');
 
exports._getInfo = function (name, key, callback) {
  var url = this.resourceURL(key) + '?' + name;
  this._request(url, callback);
};
 
/**
 * Get Image base infomation.
 * @param {String} key
 * @param {Function(err, info)} callback
 *  - {Object} info
 *   - {String} format "png", "jpeg", "gif", "bmp", etc.
 *   - {String} colorModel "palette16", "ycbcr", etc.
 *   - {Number} width
 *   - {Number} height
 */
exports.imageInfo = function (key, callback) {
  this._getInfo('imageInfo', key, callback);
};
 
exports.exif = function (key, callback) {
  this._getInfo('exif', key, callback);
};
 
/**
 * 生成指定规格的缩略图
 * 
 * @param {String} key
 * @param {Object} options thumbnail options.
 *  - {Number} mode
 *      <mode>=1  表示限定目标缩略图的宽度和高度,放大并从缩略图中央处裁剪为指定 <Width>x<Height> 大小的图片。
 *      <mode>=2  指定 <Width> 和 <Height>,表示限定目标缩略图的长和宽,将缩略图的大小限定在指定的宽高矩形内。
 *      <mode>=2  指定 <Width> 但不指定 <Height>,表示限定目标缩略图的宽度,高度等比缩略自适应。
 *      <mode>=2  指定 <Height> 但不指定 <Width>,表示限定目标缩略图的高度,宽度等比缩略自适应。
 *  - {Number} width
 *  - {Number} height
 *  - {Number} [quality]
 *  - {String} [format] 指定目标缩略图的输出格式,取值范围:jpg, gif, png, webp 等图片格式
 * @return {String} thumbnail url
 */
exports.imageView = function (key, options) {
  var url = this.resourceURL(key) + '?imageView/' + options.mode;
  if (options.width) {
    url += '/w/' + options.width;
  }
  if (options.height) {
    url += '/h/' + options.height;
  }
  if (options.quality) {
    url += '/q/' + options.quality;
  }
  if (options.format) {
    url += '/format/' + options.format;
  }
  return url;
};
 
/**
 * 高级图像处理接口(第二版)(缩略、裁剪、旋转、转化)
 * 除了能够方便的生成图像缩略图之外,七牛云存储提供了其它高级图像处理接口,包含缩略、裁剪、旋转等一系列的功能.
 * 
 * @param {String} key
 * @param {Object} options
 *  - {String} [thumbnail] 缩略图大小,详解见下。
 *  - {String} [gravity] 位置偏移,只会使其后的裁剪偏移({offset})受到影响。默认值为 NorthWest(左上角)。
 *      可选值:NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast 。
 *  - {String} [crop] 裁剪大小和偏移,详解见下。
 *  - {Number} [quality] 图片质量,取值范围是[1, 100]。
 *  - {Number} [rotate] 旋转角度。
 *  - {String} [format] 输出格式,可选为jpg, gif, png, bmp, tiff, webp等。
 * @return {String}
 */
exports.imageMogr = function (key, options) {
  var url = this.resourceURL(key) + '?imageMogr/v2/auto-orient';
  for (var k in options) {
    url += '/' + k + '/' + options[k];
  }
  return url;
};
 
/**
 * 图像水印接口支持两种加水印的方式:图片水印和文字水印。
 * 
 * @param {String} key
 * @param {Object} options
 *  - {Number} mode 
 *  <Mode> = 1 时,表示图片水印:
 *   - {String} image 水印图片,使用图片水印时需指定用于水印的远程图片URL。EncodedImageURL = urlsafe_base64_encode(ImageURL)
 *  <Mode> = 2 时,表示文字水印:
 *   - {String} text 水印文本,文字水印时必须。EncodedText = urlsafe_base64_encode(Text)
 *   - {String} [font] 字体名,若水印文本为非英文字符(比如中文)构成,则必须。EncodedFontName = urlsafe_base64_encode(FontName)
 *   - {Number} [fontsize] 字体大小,0 表示默认,单位: 缇,等于 1⁄20 磅。
 *   - {String} [fill] 字体颜色。EncodedTextColor = urlsafe_base64_encode(TextColor)。
 *       RGB格式,可以是颜色名称(比如 red)或十六进制(比如 #FF0000),
 *       参考 [RGB颜色编码表](http://www.rapidtables.com/web/color/RGB_Color.htm)
 *  - {Number} [dissolve] 透明度,取值范围 1-100,默认值 100,即表示 100%(不透明)。
 *  - {String} [gravity] 位置,默认值为 SouthEast(右下角)。
 *      可选值:NorthWest, North, NorthEast, West, Center, East, SouthWest, South, SouthEast 。
 *  - {Number} [dx] 横向边距,单位:像素(px),默认值为 10。
 *  - {Number} [dy] 纵向边距,单位:像素(px),默认值为 10。
 * @return {String}
 */
exports.watermark = function (key, options) {
  var mode = Number(options.mode) || 1;
  var url = this.resourceURL(key) + '?watermark/' + mode;
  if (mode === 1) {
    url += '/image/' + utility.base64encode(options.image, true);
  } else {
    url += '/text/' + utility.base64encode(options.text, true);
    if (options.font) {
      url += '/font/' + utility.base64encode(options.font, true);
    }
    if (options.fontsize) {
      url += '/fontsize/' + options.fontsize;
    }
    if (options.fill) {
      url += '/fill/' + utility.base64encode(options.fill, true);
    }
  }
 
  var names = ['dissolve', 'gravity', 'dx', 'dy'];
  for (var i = 0; i < names.length; i++) {
    var name = names[i];
    if (options[name] !== undefined) {
      url += '/' + name + '/' + options[name];
    }
  }
 
  return url;
};