cut-image.blade.php 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212
  1. <style>
  2. .webuploader-pick {
  3. background-color: @primary;
  4. }
  5. .web-uploader .placeholder .flashTip a {
  6. color: @primary(-10);
  7. }
  8. .web-uploader .statusBar .upload-progress span.percentage,
  9. .web-uploader .filelist li p.upload-progress span {
  10. background: @primary(-8);
  11. }
  12. .web-uploader .dnd-area.webuploader-dnd-over {
  13. border: 3px dashed #999 !important;
  14. }
  15. .web-uploader .dnd-area.webuploader-dnd-over .placeholder {
  16. border: none;
  17. }
  18. .cropper-dialog {
  19. position: absolute !important;
  20. top: 48% !important;
  21. left: 50% !important;
  22. transform: translate(-50%, -50%) !important;
  23. width: 800px;
  24. }
  25. </style>
  26. <div class="{{$viewClass['form-group']}} {{ $class }}">
  27. <label for="{{$column}}" class="{{$viewClass['label']}} control-label">{!! $label !!}</label>
  28. <div class="{{$viewClass['field']}}">
  29. @include('admin::form.error')
  30. <input name="{{ $name }}" class="file-input" type="hidden" {!! $attributes !!}/>
  31. <div class="web-uploader {{ $fileType }}">
  32. <div class="queueList dnd-area" @if(!empty($upimgdemo)) style="width: 220px;float: left;" @endif>
  33. <div class="placeholder">
  34. <div class="file-picker">
  35. <div class="cropper-pick btn btn-primary" style="margin: 0 auto 15px;"><i class="feather icon-folder"></i>&nbsp; {{trans('admin.uploader.add_new_media')}}</div>
  36. <input type="file" name="_file_" id="cropperFileInput" style="display: none" />
  37. </div>
  38. {{-- <p>{{trans('admin.uploader.drag_file')}}</p>--}}
  39. </div>
  40. </div>
  41. {{-- 上传图片示例--}}
  42. @include('admin::form.upload-img-demo')
  43. <div class="statusBar" style="display:none;">
  44. <div class="upload-progress progress progress-bar-primary pull-left">
  45. <div class="progress-bar progress-bar-striped active" style="line-height:18px">0%</div>
  46. </div>
  47. <div class="info"></div>
  48. <div class="btns">
  49. <div class="new-add-file-button">
  50. <div class="cropper-pick-new btn btn-primary"><i class="feather icon-folder"></i> &nbsp;{{trans('admin.uploader.go_on_add')}}</div>
  51. </div>
  52. @if($showUploadBtn)
  53. &nbsp;
  54. <div class="upload-btn btn btn-primary"><i class="feather icon-upload"></i> &nbsp;{{trans('admin.upload')}}</div>
  55. @endif
  56. </div>
  57. </div>
  58. </div>
  59. @include('admin::form.help-block')
  60. </div>
  61. </div>
  62. <!-- 模态框(Modal)的HTML结构 -->
  63. <div class="modal" id="cropperImageModal" tabindex="-1" role="dialog" aria-labelledby="cropperImageModal-labelledby" data-backdrop="static" data-keyboard="false">
  64. <div class="modal-dialog modal-xl cropper-dialog">
  65. <div class="modal-content">
  66. <div class="modal-header">
  67. <h5 class="modal-title" id="myModalLabel">{{trans('admin.crop_the_image')}}</h5>
  68. </div>
  69. <div class="modal-body" style="height: 60vh;padding: 0;">
  70. <img src="" id="cropperImage" style="max-width: 100%"/>
  71. </div>
  72. <div class="modal-footer">
  73. <button type="button" class="btn btn-default" data-dismiss="modal" id="modalClose">{{trans('admin.close')}}</button>
  74. <button type="button" class="btn btn-primary" id="modalSubmit">{{trans('admin.submit')}}</button>
  75. </div>
  76. </div>
  77. </div>
  78. </div>
  79. <link href="/vendor/cropper/cropper.min.css" rel="stylesheet">
  80. <script src="/vendor/cropper/cropper.min.js"></script>
  81. <script require="@webuploader" init="{!! $selector !!}">
  82. var uploader,
  83. newPage,
  84. options = {!! $options !!},
  85. events = options.events;
  86. init();
  87. function init() {
  88. var opts = $.extend({
  89. selector: $this,
  90. // addFileButton: $this.find('.add-file-button'),
  91. inputSelector: $this.find('.file-input'),
  92. }, options);
  93. opts.upload = $.extend({
  94. {{--pick: {--}}
  95. {{-- id: $this.find('.file-picker'),--}}
  96. {{-- name: '_file_',--}}
  97. {{-- label: '<i class="feather icon-folder"><\/i>&nbsp; {!! trans('admin.uploader.add_new_media') !!}'--}}
  98. {{--},--}}
  99. // dnd: $this.find('.dnd-area'),
  100. paste: $this.find('.web-uploader')
  101. }, opts);
  102. uploader = Dcat.Uploader(opts);
  103. uploader.build();
  104. uploader.preview();
  105. for (var i = 0; i < events.length; i++) {
  106. var evt = events[i];
  107. if (evt.event && evt.script) {
  108. if (evt.once) {
  109. uploader.uploader.once(evt.event, evt.script.bind(uploader))
  110. } else {
  111. uploader.uploader.on(evt.event, evt.script.bind(uploader))
  112. }
  113. }
  114. }
  115. function resize() {
  116. setTimeout(function () {
  117. if (! uploader) return;
  118. uploader.refreshButton();
  119. resize();
  120. if (! newPage) {
  121. newPage = 1;
  122. $(document).one('pjax:complete', function () {
  123. uploader = null;
  124. });
  125. }
  126. }, 250);
  127. }
  128. resize();
  129. }
  130. if (options.fileNumLimit == 1) {
  131. $this.find(".cropper-pick-new").hide();
  132. }
  133. $this.find(".cropper-pick").on('click', function () {
  134. $this.find("#cropperFileInput").trigger("click");
  135. });
  136. $this.find(".cropper-pick-new").on('click', function () {
  137. $this.find("#cropperFileInput").trigger("click");
  138. });
  139. $this.find("#cropperFileInput").on('change', function () {
  140. var file = this.files[0];
  141. //定义读文件对象
  142. var reader = new FileReader();
  143. reader.onload = function () {
  144. imageOnload(reader.result);
  145. };
  146. reader.readAsDataURL(file);//File对象转换为dataURL
  147. });
  148. let cropper; // 全局变量,用于保存 Cropper 实例
  149. //图片对象加载方法
  150. function imageOnload(url) {
  151. const image = document.getElementById('cropperImage');
  152. image.src = url;
  153. if (cropper) {
  154. cropper.destroy(); // 如果已经存在实例,销毁之前的裁剪器
  155. }
  156. aspectRatio = options.aspectRatio || 1/1; // 默认裁剪框比例为 1/1
  157. cropper = new Cropper(image, {
  158. aspectRatio: aspectRatio, // 设置裁剪框的宽高比(可调整)
  159. viewMode: 1, // 设置裁剪框的视图模式
  160. autoCropArea: 0.95, // 设置自动裁剪区域占比
  161. dragMode: 'none',
  162. background: true,
  163. });
  164. //弹窗裁剪
  165. $('#cropperImageModal').modal();
  166. }
  167. $("#modalClose").on('click', function () {
  168. $("#cropperFileInput").val('');
  169. $('#cropperImageModal').modal('hide');
  170. });
  171. $("#modalSubmit").on('click', function () {
  172. const canvas = cropper.getCroppedCanvas();
  173. canvas.toBlob(function(blob) {
  174. fileFromBlob = new File([blob], 'cropperImage.webp', { type: "image/webp" });
  175. $('#cropperImageModal').modal('hide');
  176. $("#cropperFileInput").val('');
  177. //增加文件到上传队列
  178. uploader.uploader.addFile(fileFromBlob);
  179. },"image/webp", 0.9);
  180. });
  181. </script>