ImageUrlBuilder.php 7.3 KB

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