212 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Vue
		
	
	
			
		
		
	
	
			212 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Vue
		
	
	
| <template>
 | ||
| 
 | ||
|   <div class="index">
 | ||
|     <u-modal v-model="show" :show-title="false" :show-confirm-button="false" mask-close-able>
 | ||
|       <view class="slot-content">
 | ||
|         <image @click="downLoad()" class="img" :src="imgUrl" />
 | ||
|         <div class="canvas-hide">
 | ||
|           <!-- #ifdef MP-WEIXIN -->
 | ||
|           <canvas id="canvas" type="2d" style="width: 600px; height: 960px" />
 | ||
|           <!-- #endif -->
 | ||
|           <!-- #ifndef MP-WEIXIN -->
 | ||
|           <canvas canvas-id="canvas" id="canvas" style="width: 600px; height: 960px" />
 | ||
|           <!-- #endif -->
 | ||
|         </div>
 | ||
|       </view>
 | ||
|     </u-modal>
 | ||
| 
 | ||
|   </div>
 | ||
| </template>
 | ||
| <script>
 | ||
| // 引入绘制插件
 | ||
| import DrawPoster from "@/js_sdk/u-draw-poster";
 | ||
| 
 | ||
| export default {
 | ||
|   data: () => ({
 | ||
|     imgUrl: "", //绘制出来的图片路径
 | ||
|     show: false, //是否展示模态框
 | ||
|     dp: {}, //绘制的dp对象,用于存储绘制等一些方法。
 | ||
|     logo: require("@/pages/passport/static/logo-title.png"), //本地logo地址
 | ||
|   }),
 | ||
| 
 | ||
|   props: {
 | ||
|     /**
 | ||
|      * 父级传参的数据
 | ||
|      */
 | ||
|     res: {
 | ||
|       type: null,
 | ||
|       default: "",
 | ||
|     },
 | ||
|   },
 | ||
|   onUnload() {},
 | ||
| 
 | ||
|   methods: {
 | ||
|     /**
 | ||
|      * 解决微信小程序中图片模糊问题
 | ||
|      */
 | ||
|     // #ifdef MP-WEIXIN
 | ||
|     st2: (size) => size * 2,
 | ||
|     // #endif
 | ||
| 
 | ||
|     // #ifndef MP-WEIXIN
 | ||
|     st2: (size) => size,
 | ||
|     // #endif
 | ||
| 
 | ||
|     /**
 | ||
|      * 保存图片
 | ||
|      */
 | ||
|     downLoad() {
 | ||
|       uni.saveImageToPhotosAlbum({
 | ||
|         filePath: this.imgUrl,
 | ||
|         success: function () {
 | ||
|           uni.showToast({
 | ||
|             title: "保存成功!",
 | ||
|             icon: "none",
 | ||
|           });
 | ||
|         },
 | ||
|         fail: function () {
 | ||
|           uni.showToast({
 | ||
|             title: "保存失败,请稍后重试!",
 | ||
|             icon: "none",
 | ||
|           });
 | ||
|         },
 | ||
|       });
 | ||
|     },
 | ||
| 
 | ||
|     /**
 | ||
|      * 创建canvas
 | ||
|      */
 | ||
|     async init() {
 | ||
|       this.show = true;
 | ||
|       this.dp = await DrawPoster.build({
 | ||
|         selector: "canvas",
 | ||
|         componentThis: this,
 | ||
|         loading: true,
 | ||
|         debugging: true,
 | ||
|       });
 | ||
|       let dp = this.dp;
 | ||
|       // #ifdef MP-WEIXIN
 | ||
|       // 用于微信小程序中画布错乱问题
 | ||
|       dp.canvas.width = this.st2(600);
 | ||
|       dp.canvas.height = this.st2(960);
 | ||
|       // #endif
 | ||
|       this.draw(dp);
 | ||
|     },
 | ||
| 
 | ||
|     async draw(dp) {
 | ||
|       const { width, height, background, title } = this.res.container;
 | ||
|       const { code, img, price } = this.res.bottom;
 | ||
| 
 | ||
|       // /** 绘制背景 */
 | ||
|       await dp.draw((ctx) => {
 | ||
|         ctx.fillStyle = background;
 | ||
|         ctx.fillRoundRect(
 | ||
|           this.st2(0),
 | ||
|           this.st2(0),
 | ||
|           this.st2(width),
 | ||
|           this.st2(height),
 | ||
|           this.st2(12)
 | ||
|         );
 | ||
|         ctx.clip();
 | ||
|       });
 | ||
|       /** 绘制图片 */
 | ||
|       dp.draw(async (ctx) => {
 | ||
|         await Promise.all([
 | ||
|           // 绘制Logo
 | ||
|           ctx.drawImage(
 | ||
|             this.logo,
 | ||
|             this.st2(175),
 | ||
|             this.st2(0),
 | ||
|             this.st2(256),
 | ||
|             this.st2(144)
 | ||
|           ),
 | ||
|           // 中间图片
 | ||
|           ctx.drawImage(
 | ||
|             img,
 | ||
|             this.st2(100),
 | ||
|             this.st2(150),
 | ||
|             this.st2(400),
 | ||
|             this.st2(400)
 | ||
|           ),
 | ||
|           // 二维码
 | ||
|           ctx.drawImage(
 | ||
|             code,
 | ||
|             this.st2(39),
 | ||
|             this.st2(750),
 | ||
|             this.st2(150),
 | ||
|             this.st2(150)
 | ||
|           ),
 | ||
|         ]);
 | ||
|       });
 | ||
| 
 | ||
|       /** 绘制中间文字*/
 | ||
|       await dp.draw((ctx) => {
 | ||
|         ctx.fillStyle = "#333";
 | ||
|         ctx.font = `bold ${this.st2(24)}px PingFang SC`;
 | ||
|         ctx.textAlign = "center";
 | ||
|         ctx.fillWarpText({
 | ||
|           text: title,
 | ||
|           maxWidth: this.st2(500),
 | ||
|           x: this.st2(300),
 | ||
|           y: this.st2(600),
 | ||
|           layer: 1,
 | ||
|         });
 | ||
| 
 | ||
|         ctx.fillStyle = "#ff3c2a";
 | ||
|         ctx.font = `${this.st2(38)}px PingFang SC`;
 | ||
|         ctx.textAlign = "center";
 | ||
|         ctx.fillText(price, this.st2(300), this.st2(680));
 | ||
|       });
 | ||
| 
 | ||
|       // /** 绘制底部文字 */
 | ||
|       await dp.draw((ctx) => {
 | ||
|         ctx.fillStyle = "#666";
 | ||
|         ctx.font = `${this.st2(24)}px PingFang SC`;
 | ||
|         ctx.fillText("长按图片,识别二维码", this.st2(200), this.st2(866));
 | ||
|         ctx.fillStyle = "#666";
 | ||
|         ctx.font = `${this.st2(24)}px PingFang SC`;
 | ||
|         ctx.fillText("查看商品详情", this.st2(200), this.st2(900));
 | ||
|       });
 | ||
| 
 | ||
|       this.imgUrl = await dp.createImagePath();
 | ||
| 
 | ||
|       // console.log(posterImgUrl)
 | ||
|     },
 | ||
|   },
 | ||
| 
 | ||
|   async mounted() {
 | ||
|     this.init();
 | ||
|   },
 | ||
| };
 | ||
| </script>
 | ||
| 
 | ||
| <style lang="scss" scoped>
 | ||
| page,
 | ||
| .index {
 | ||
|   height: 100%;
 | ||
| }
 | ||
| .canvas-hide {
 | ||
|   /* 1 */
 | ||
|   position: fixed;
 | ||
|   right: 100vw;
 | ||
|   bottom: 100vh;
 | ||
|   /* 2 */
 | ||
|   z-index: -9999;
 | ||
|   /* 3 */
 | ||
|   opacity: 0;
 | ||
| }
 | ||
| .index {
 | ||
|   position: relative;
 | ||
|   text-align: center;
 | ||
|   background: rgba($color: grey, $alpha: 0.2);
 | ||
| }
 | ||
| 
 | ||
| image {
 | ||
|   display: block;
 | ||
| }
 | ||
| .img {
 | ||
|   width: 600rpx;
 | ||
|   height: 960rpx;
 | ||
| }
 | ||
| </style>
 |