123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223 |
- <template>
- <view class="content">
- <view class="title-view" :style="{height: navigationBarHeight + 'px'}">
- <navigator open-type="navigateBack" class="back-btn mix-icon icon-xiangzuo"></navigator>
- <text class="title">裁剪</text>
- <text class="empty"></text>
- </view>
- <view class="cropper-wrapper">
- <canvas
- class="cropper"
- disable-scroll="true"
- @touchstart="touchStart"
- @touchmove="touchMove"
- @touchend="touchEnd"
- :style="{ width: cropperOpt.width, height: cropperOpt.height }"
- canvas-id="cropper"
- ></canvas>
- </view>
- <view class="cropper-buttons">
- <view class="btn upload" @tap="uploadTap">重选</view>
- <view class="btn getCropperImage" @tap="getCropperImage">确定</view>
- </view>
- </view>
- </template>
- <script>
- import weCropper from './cut.js';
- const device = uni.getSystemInfoSync();
- const width = device.windowWidth;
- const height = device.windowHeight;
- export default {
- data() {
- return {
- cropperOpt: {
- id: 'cropper',
- width: width,
- height: height,
- scale: 2.5,
- zoom: 8,
- cut: {
- x: (width - 200) / 2,
- y: (height - this.systemInfo.navigationBarHeight - this.systemInfo.statusBarHeight - 200) / 2,
- width: 200,
- height: 200
- }
- },
- weCropper: ''
- };
- },
- computed: {
- navigationBarHeight(){
- console.log(this.systemInfo.navigationBarHeight);
- return this.systemInfo.navigationBarHeight;
- }
- },
- onLoad(option) {
- // do something
- const cropperOpt = this.cropperOpt;
- const src = option.src;
- console.log(src);
- if (src) {
- Object.assign(cropperOpt, {
- src
- });
- this.weCropper = new weCropper(cropperOpt)
- .on('ready', function(ctx) {})
- .on('beforeImageLoad', ctx => {
- /* uni.showToast({
- title: '上传中',
- icon: 'loading',
- duration: 3000
- }); */
- })
- .on('imageLoad', ctx => {
- uni.hideToast();
- });
- }
- },
- methods: {
- touchStart(e) {
- this.weCropper.touchStart(e);
- },
- touchMove(e) {
- this.weCropper.touchMove(e);
- },
- touchEnd(e) {
- this.weCropper.touchEnd(e);
- },
- convertBase64UrlToBlob(dataURI, type) {
- var binary = atob(dataURI.split(',')[1]);
- var array = [];
- for (var i = 0; i < binary.length; i++) {
- array.push(binary.charCodeAt(i));
- }
- return new Blob([new Uint8Array(array)], {
- type: type
- }, {
- filename: '1111.jpg'
- });
- },
- blobToDataURL(blob) {
- var a = new FileReader();
- a.readAsDataURL(blob); //读取文件保存在result中
- a.onload = function(e) {
- var getRes = e.target.result; //读取的结果在result中
- console.log(getRes);
- };
- },
- getCropperImage() {
- let _this = this;
- this.weCropper.getCropperImage(avatar => {
- if (avatar) {
- this.$util.prePage().setAvatar(avatar);
- uni.navigateBack();
- } else {
- console.log('获取图片失败,请稍后重试');
- }
- });
- },
- uploadTap() {
- const self = this;
- uni.chooseImage({
- count: 1, // 默认9
- sizeType: ['compressed'], // 可以指定是原图还是压缩图,默认二者都有
- sourceType: ['album', 'camera'], // 可以指定来源是相册还是相机,默认二者都有
- success(res) {
- let src = res.tempFilePaths[0];
- // 获取裁剪图片资源后,给data添加src属性及其值
- self.weCropper.pushOrign(src);
- }
- });
- }
- },
- };
- </script>
- <style lang="scss">
- page, .content{
- width: 100%;
- height: 100%;
- overflow: hidden;
- }
- .content {
- display: flex;
- flex-direction: column;
- background-color: #000;
- padding-top: var(--status-bar-height);
- }
- .title-view{
- flex-shrink: 0;
- display: flex;
- align-items: center;
- justify-content: space-between;
- width: 100%;
- background: transparent;
-
- .back-btn{
- display: flex;
- justify-content: center;
- align-items: center;
- width: 42px;
- height: 40px;
- font-size: 18px;
- color: #fff;
- }
- .title{
- font-size: 17px;
- color: #fff;
- }
- .empty{
- width: 42px;
- }
- }
- .cropper {
- width: 100%;
- flex: 1;
- }
- .cropper-wrapper {
- flex: 1;
- position: relative;
- display: flex;
- flex-direction: column;
- justify-content: space-between;
- align-items: center;
- width: 100%;
- background-color: #000;
- }
- .cropper-buttons {
- flex-shrink: 0;
- display: flex;
- justify-content: space-between;
- align-items: center;
- width: 100%;
- height: 50px;
- background-color: rgba(0, 0, 0, 0.4);
-
- .btn{
- width: 100px;
- height: 50px;
- line-height: 50px;
- font-size: 15px;
- color: #fff;
-
- &.upload{
- padding-left: 20px;
- }
-
- &.getCropperImage{
- padding-right: 20px;
- text-align: right;
- }
- }
- }
- </style>
|