• uniapp vue3 裁剪头像(ksp-cropper) 支持旋转 和 缩放


    一、前言

    自己写个项目,需要用到裁剪头像功能,那肯定就在插件市场搜索,找到了它,感谢作者这个插件,很棒。我的使用环境 uniapp vue3 移动端 Android 真机测试

    具体我使用后的效果图如下:下面我主要是详细的补充一下ksp-cropper官方文档

    二、使用场景效果图和代码

     解释操作逻辑:我点击右上角三个点图标,进入相册选择图片,得到选择的图片路径赋值给

    ksp-cropper 组件,此时进入裁剪模式。点击确认,将得到裁剪后的图片路径。具体代码如下

    1. <template>
    2. <view class="header">
    3. <view @click="goBack">
    4. <u-icon name="arrow-left" color="#fff" size="22px"></u-icon>
    5. </view>
    6. <text style="margin-left: 30rpx;">更换头像</text>
    7. <view class="moreDot" @click="selectNewImg">
    8. <u-icon name="more-dot-fill" color="#fff"></u-icon>
    9. </view>
    10. </view>
    11. <view class="portraitBox">
    12. <image mode="scaleToFill" class="myPortrait" :src="avatorUrl"></image>
    13. </view>
    14. <ksp-cropper
    15. mode="free"
    16. :width="250"
    17. :height="250"
    18. :maxWidth="1024"
    19. :maxHeight="1024"
    20. :url="url" @cancel="oncancel" @ok="onok"></ksp-cropper>
    21. </template>
    22. <script setup>
    23. import {userStore} from '@/stores/user.js';
    24. import { ref,onMounted } from "vue";
    25. const userStoreTemp = userStore();
    26. let url=ref(''); //选择裁剪的图片
    27. let avatorUrl = ref(''); //显示的头像
    28. onMounted(()=>{
    29. avatorUrl.value = userStoreTemp.user.portrait;
    30. });
    31. //返回上个路由页面
    32. const goBack = ()=>{
    33. uni.navigateBack();
    34. }
    35. //选择新的图像
    36. const selectNewImg = ()=>{
    37. uni.chooseImage({
    38. count: 1, //默认9
    39. sizeType: ['original', 'compressed'],
    40. success: function (res) {
    41. console.log(JSON.stringify(res.tempFilePaths));
    42. url.value = res.tempFilePaths[0];
    43. }
    44. });
    45. }
    46. const onok = (res)=>{
    47. console.log("点击确认",res);
    48. url.value = "";
    49. avatorUrl.value = res.path;
    50. };
    51. const oncancel = (res)=>{
    52. url.value = "";
    53. console.log("点击取消",res);
    54. };
    55. </script>
    56. <style scoped lang="less">
    57. .header{
    58. display: flex;
    59. flex-direction: row;
    60. justify-content: space-between;
    61. align-items: center;
    62. background-color: #000;
    63. height: 70rpx;
    64. line-height: 70rpx;
    65. color: #fff;
    66. padding: 8rpx 16rpx;
    67. .moreDot{
    68. padding: 15rpx 15rpx;
    69. }
    70. }
    71. .portraitBox{
    72. padding: 0 16rpx;
    73. .myPortrait{
    74. width: 500rpx;
    75. height: 500rpx;
    76. }
    77. }
    78. </style>

     三、遇到的问题解释

    1. 在app移动端状态下,无法上下左右拖拽

    答:解决办法是进入源码uni_modules下面,找到ksp-cropper.vue文件,将其中的 event.preventDefault(); event.stopPropagation(); 两行代码注释即可

    2. 安卓真机会一直卡在 处理中

    答:是因为没在取消 和确定的处理函数中,将url的值设置为空。

    3. 点击 确认裁剪 得到的路径是相对路径

    _doc/uniapp_temp_1667466828646/canvas/16674669200830.png

    这样的路径,可以显示图片,但无法通过 new plus.io.FileReade 读取出来。

    我的需求是需要将该图片转化为二进制。我将该相对路径转化成绝对路径后,

    1. //将对象路径转化为绝对路径
    2. let temp = plus.io.convertLocalFileSystemURL('相对路径');
    3. //将fill协议 拼接完成 绝对路径
    4. let imgStr = "file://"+temp;

  • 相关阅读:
    新版本idea中使用springboot 国际化 Resource Bundle不显示
    【升级U8+】为视图或函数 ‘Ap_DetailVend‘ 指定的列名比其定义中的列多。
    开具数电票如何减少认证频次?
    Mycat+分库分表
    VLAN trunk扩展 MUXVLAN 原理与实验
    #机器学习--高等数学基础--第二章:导数与微分
    【模板】组合数取模
    vue-我可以在另一个计算属性中使用计算属性吗?
    php-jwt简单鉴权使用方法
    (操作系统开发)从实模式---->保护模式---->IA-32e模式( 64位模式)
  • 原文地址:https://blog.csdn.net/tengyuxin/article/details/127641658