ImageUrlBuilder.php 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  1. <?php
  2. namespace Qiniu\Processing;
  3. use Qiniu;
  4. /**
  5. * 主要涉及图片链接拼接
  6. *
  7. * @link http://developer.qiniu.com/code/v6/api/kodo-api/image/imageview2.html
  8. */
  9. final class ImageUrlBuilder
  10. {
  11. /**
  12. * mode合法范围值
  13. *
  14. * @var array
  15. */
  16. protected $modeArr = array(0, 1, 2, 3, 4, 5);
  17. /**
  18. * format合法值
  19. *
  20. * @var array
  21. */
  22. protected $formatArr = array('psd', 'jpeg', 'png', 'gif', 'webp', 'tiff', 'bmp');
  23. /**
  24. * 水印图片位置合法值
  25. *
  26. * @var array
  27. */
  28. protected $gravityArr = array(
  29. 'NorthWest',
  30. 'North',
  31. 'NorthEast',
  32. 'West',
  33. 'Center',
  34. 'East',
  35. 'SouthWest',
  36. 'South',
  37. 'SouthEast'
  38. );
  39. /**
  40. * 缩略图链接拼接
  41. *
  42. * @param string $url 图片链接
  43. * @param int $mode 缩略模式
  44. * @param int $width 宽度
  45. * @param int $height 长度
  46. * @param string $format 输出类型
  47. * @param int $quality 图片质量
  48. * @param int $interlace 是否支持渐进显示
  49. * @param int $ignoreError 忽略结果
  50. * @return string
  51. * @link http://developer.qiniu.com/code/v6/api/kodo-api/image/imageview2.html
  52. * @author Sherlock Ren <sherlock_ren@icloud.com>
  53. */
  54. public function thumbnail(
  55. $url,
  56. $mode,
  57. $width,
  58. $height,
  59. $format = null,
  60. $interlace = null,
  61. $quality = null,
  62. $ignoreError = 1
  63. ) {
  64. // url合法效验
  65. if (!$this->isUrl($url)) {
  66. return $url;
  67. }
  68. // 参数合法性效验
  69. if (!in_array(intval($mode), $this->modeArr, true)) {
  70. return $url;
  71. }
  72. if (!$width || !$height) {
  73. return $url;
  74. }
  75. $thumbStr = 'imageView2/' . $mode . '/w/' . $width . '/h/' . $height . '/';
  76. // 拼接输出格式
  77. if (!is_null($format)
  78. && in_array($format, $this->formatArr)
  79. ) {
  80. $thumbStr .= 'format/' . $format . '/';
  81. }
  82. // 拼接渐进显示
  83. if (!is_null($interlace)
  84. && in_array(intval($interlace), array(0, 1), true)
  85. ) {
  86. $thumbStr .= 'interlace/' . $interlace . '/';
  87. }
  88. // 拼接图片质量
  89. if (!is_null($quality)
  90. && intval($quality) >= 0
  91. && intval($quality) <= 100
  92. ) {
  93. $thumbStr .= 'q/' . $quality . '/';
  94. }
  95. $thumbStr .= 'ignore-error/' . $ignoreError . '/';
  96. // 如果有query_string用|线分割实现多参数
  97. return $url . ($this->hasQuery($url) ? '|' : '?') . $thumbStr;
  98. }
  99. /**
  100. * 图片水印
  101. *
  102. * @param string $url 图片链接
  103. * @param string $image 水印图片链接
  104. * @param int $dissolve 透明度
  105. * @param string $gravity 水印位置
  106. * @param int $dx 横轴边距
  107. * @param int $dy 纵轴边距
  108. * @param int $watermarkScale 自适应原图的短边比例
  109. * @return string
  110. * @link http://developer.qiniu.com/code/v6/api/kodo-api/image/watermark.html
  111. * @author Sherlock Ren <sherlock_ren@icloud.com>
  112. */
  113. public function waterImg(
  114. $url,
  115. $image,
  116. $dissolve = 100,
  117. $gravity = 'SouthEast',
  118. $dx = null,
  119. $dy = null,
  120. $watermarkScale = null
  121. ) {
  122. // url合法效验
  123. if (!$this->isUrl($url)) {
  124. return $url;
  125. }
  126. $waterStr = 'watermark/1/image/' . \Qiniu\base64_urlSafeEncode($image) . '/';
  127. // 拼接水印透明度
  128. if (is_numeric($dissolve)
  129. && $dissolve <= 100
  130. ) {
  131. $waterStr .= 'dissolve/' . $dissolve . '/';
  132. }
  133. // 拼接水印位置
  134. if (in_array($gravity, $this->gravityArr, true)) {
  135. $waterStr .= 'gravity/' . $gravity . '/';
  136. }
  137. // 拼接横轴边距
  138. if (!is_null($dx)
  139. && is_numeric($dx)
  140. ) {
  141. $waterStr .= 'dx/' . $dx . '/';
  142. }
  143. // 拼接纵轴边距
  144. if (!is_null($dy)
  145. && is_numeric($dy)
  146. ) {
  147. $waterStr .= 'dy/' . $dy . '/';
  148. }
  149. // 拼接自适应原图的短边比例
  150. if (!is_null($watermarkScale)
  151. && is_numeric($watermarkScale)
  152. && $watermarkScale > 0
  153. && $watermarkScale < 1
  154. ) {
  155. $waterStr .= 'ws/' . $watermarkScale . '/';
  156. }
  157. // 如果有query_string用|线分割实现多参数
  158. return $url . ($this->hasQuery($url) ? '|' : '?') . $waterStr;
  159. }
  160. /**
  161. * 文字水印
  162. *
  163. * @param string $url 图片链接
  164. * @param string $text 文字
  165. * @param string $font 文字字体
  166. * @param string $fontSize 文字字号
  167. * @param string $fontColor 文字颜色
  168. * @param int $dissolve 透明度
  169. * @param string $gravity 水印位置
  170. * @param int $dx 横轴边距
  171. * @param int $dy 纵轴边距
  172. * @return string
  173. * @link http://developer.qiniu.com/code/v6/api/kodo-api/image/watermark.html#text-watermark
  174. * @author Sherlock Ren <sherlock_ren@icloud.com>
  175. */
  176. public function waterText(
  177. $url,
  178. $text,
  179. $font = '黑体',
  180. $fontSize = 0,
  181. $fontColor = null,
  182. $dissolve = 100,
  183. $gravity = 'SouthEast',
  184. $dx = null,
  185. $dy = null
  186. ) {
  187. // url合法效验
  188. if (!$this->isUrl($url)) {
  189. return $url;
  190. }
  191. $waterStr = 'watermark/2/text/'
  192. . \Qiniu\base64_urlSafeEncode($text) . '/font/'
  193. . \Qiniu\base64_urlSafeEncode($font) . '/';
  194. // 拼接文字大小
  195. if (is_int($fontSize)) {
  196. $waterStr .= 'fontsize/' . $fontSize . '/';
  197. }
  198. // 拼接文字颜色
  199. if (!is_null($fontColor)
  200. && $fontColor
  201. ) {
  202. $waterStr .= 'fill/' . \Qiniu\base64_urlSafeEncode($fontColor) . '/';
  203. }
  204. // 拼接水印透明度
  205. if (is_numeric($dissolve)
  206. && $dissolve <= 100
  207. ) {
  208. $waterStr .= 'dissolve/' . $dissolve . '/';
  209. }
  210. // 拼接水印位置
  211. if (in_array($gravity, $this->gravityArr, true)) {
  212. $waterStr .= 'gravity/' . $gravity . '/';
  213. }
  214. // 拼接横轴边距
  215. if (!is_null($dx)
  216. && is_numeric($dx)
  217. ) {
  218. $waterStr .= 'dx/' . $dx . '/';
  219. }
  220. // 拼接纵轴边距
  221. if (!is_null($dy)
  222. && is_numeric($dy)
  223. ) {
  224. $waterStr .= 'dy/' . $dy . '/';
  225. }
  226. // 如果有query_string用|线分割实现多参数
  227. return $url . ($this->hasQuery($url) ? '|' : '?') . $waterStr;
  228. }
  229. /**
  230. * 效验url合法性
  231. *
  232. * @param string $url url链接
  233. * @return string
  234. * @author Sherlock Ren <sherlock_ren@icloud.com>
  235. */
  236. protected function isUrl($url)
  237. {
  238. $urlArr = parse_url($url);
  239. return $urlArr['scheme']
  240. && in_array($urlArr['scheme'], array('http', 'https'))
  241. && $urlArr['host']
  242. && $urlArr['path'];
  243. }
  244. /**
  245. * 检测是否有query
  246. *
  247. * @param string $url url链接
  248. * @return string
  249. * @author Sherlock Ren <sherlock_ren@icloud.com>
  250. */
  251. protected function hasQuery($url)
  252. {
  253. $urlArr = parse_url($url);
  254. return !empty($urlArr['query']);
  255. }
  256. }