nicehero commited on
Commit
56ca385
·
verified ·
1 Parent(s): 505a274

Upload mask.html

Browse files
Files changed (1) hide show
  1. mask.html +577 -0
mask.html ADDED
@@ -0,0 +1,577 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta charset="UTF-8">
5
+ <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no">
6
+ <title>蒙版王</title>
7
+ <style>
8
+ /* 适用于手机的样式 */
9
+ @media (max-width: 767px) {
10
+ body {
11
+ width: 350;
12
+ margin: 0 auto; /* 水平居中 */
13
+ }
14
+ #canvas {
15
+ border: 1px solid #000;
16
+ width: 100%;
17
+ height: auto;
18
+ }
19
+ html, body {
20
+ overflow-x: hidden;
21
+ }
22
+ #uploadButton{
23
+ width: 80%;
24
+ }
25
+ #save{
26
+ width: 20%;
27
+ }
28
+ .myDiv {
29
+ width: 98%;
30
+ display: flex;
31
+ flex-direction: row;
32
+ justify-content: flex-start;
33
+ margin: 0px 1%;
34
+ }
35
+ .overlay {
36
+ left: 20px;
37
+ }
38
+ }
39
+ /* 适用于电脑的样式 */
40
+ @media (min-width: 768px) {
41
+ #canvas {
42
+ border: 1px solid #000;
43
+ width: auto;
44
+ height: auto;
45
+ }
46
+ .myDiv {
47
+ display: flex;
48
+ flex-direction: row;
49
+ justify-content: center;
50
+ margin: 0 100px;
51
+ width: 512px;
52
+ }
53
+ .overlay {
54
+ left: 100px;
55
+ }
56
+ }
57
+ #circle {
58
+ position: absolute;
59
+ width: 10px;
60
+ height: 10px;
61
+ border-radius: 50%;
62
+ border: 2px solid red;
63
+ background-color: transparent;
64
+ transition: opacity 1s;
65
+ pointer-events: none;
66
+ }
67
+ .show {
68
+ opacity: 1;
69
+ }
70
+ .hide {
71
+ opacity: 0;
72
+ }
73
+ .overlay {
74
+ position: absolute;
75
+ top: 82px;
76
+ z-index: 10;
77
+ /* 设置悬浮控件的样式和尺寸 */
78
+ /* 可以使用 z-index 属性来控制层叠顺序 */
79
+ }
80
+ </style>
81
+ </head>
82
+ <body>
83
+ <div class="myDiv">
84
+ <button id="uploadButton" style="box-sizing: border-box; padding: 10px; font-size: 16px; height: 50px; line-height: 30px; overflow: hidden; position: relative;">
85
+ 选择图片
86
+ <input type="file" id="upload" accept="image/*" style="position: absolute; top: 0; left: 0; width: 98%; height: 100%; opacity: 0; cursor: pointer;">
87
+ </button>
88
+ <button id="save" style="height: 50px;">保存蒙版</button>
89
+ </div>
90
+ <div class="myDiv">
91
+ <input type="range" id="brushSizeSlider" style="width: 100%" value="40" min="1" max="150" step="1" >
92
+ </div>
93
+ <br>
94
+ <br>
95
+ <div class="myDiv">
96
+ <canvas id="canvas"></canvas>
97
+ </div>
98
+ <div class="overlay" style="display: flex; flex-direction: row; align-items: flex-start;">
99
+ <label style="margin-bottom: 10px;">
100
+ <input type="radio" name="editMode" value="draw" checked> 画笔模式
101
+ </label>
102
+ <label style="margin-bottom: 10px;">
103
+ <input type="radio" name="editMode" value="erase"> 擦除模式
104
+ </label>
105
+ <label>
106
+ <input type="radio" name="editMode" value="select"> 不编辑
107
+ </label>
108
+ </div>
109
+ <div id="circle" style="width: 20px; height: 20px; border-radius: 50%; border: 2px solid red;"></div>
110
+ <script src="https://telegram.org/js/telegram-web-app.js"></script>
111
+ <script>
112
+ // Init TWA
113
+ Telegram.WebApp.ready();
114
+ Telegram.WebApp.expand();
115
+ Telegram.WebApp.enableClosingConfirmation()
116
+ Telegram.WebApp.HapticFeedback.impactOccurred("medium");
117
+ // Event occurs whenever theme settings are changed in the user's Telegram app (including switching to night mode).
118
+ Telegram.WebApp.onEvent('themeChanged', function() {
119
+ document.documentElement.className = Telegram.WebApp.colorScheme;
120
+ });
121
+ window.onload = function() {
122
+ var canvas = document.getElementById('canvas');
123
+ var context = canvas.getContext('2d');
124
+ var image = new Image();
125
+ var imageMask = new Image();
126
+ var maskData = null;
127
+ var isDrawing = false;
128
+ var brushSize = 40;
129
+ var intervalHandel = null;
130
+ var brushSizeSlider = document.getElementById('brushSizeSlider');
131
+ var editModeRadios = document.getElementsByName('editMode');
132
+ var selectedMode = "draw";
133
+ var isRotate = false;
134
+ function isMobile() {
135
+ return (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent));
136
+ }
137
+ for (var i = 0; i < editModeRadios.length; i++) {
138
+ editModeRadios[i].addEventListener('change', function() {
139
+ // 获取选中的编辑模式值
140
+ selectedMode = this.value;
141
+ drawImagesInterval(100);
142
+ });
143
+ }
144
+ brushSizeSlider.addEventListener('input', function() {
145
+ brushSize = parseInt(this.value);
146
+ setCircleSize(brushSize);
147
+ if (isMobile()){
148
+ var canvasRect = canvas.getBoundingClientRect();
149
+ var scaleX = canvas.width / canvasRect.width;
150
+ showCircle(175 + window.scrollX, 200 + window.scrollY, scaleX);
151
+ }
152
+ });
153
+ function resizeImage(img,s,resizedImage) {
154
+ var maxWidth = s; // 最大宽度
155
+ var maxHeight = s; // 最大高度
156
+ var width = img.width;
157
+ var height = img.height;
158
+ if (width/height < 4/3 && width <= maxWidth && height <= maxHeight) {
159
+ return false;
160
+ }
161
+ if (!isMobile() && width <= maxWidth && height <= maxHeight) {
162
+ return false;
163
+ }
164
+ if (width > maxWidth || height > maxHeight || width/height >= 4/3) {
165
+ var ratio = Math.max(maxWidth / width, maxHeight / height);
166
+ if (width <= maxWidth && height <= maxHeight){
167
+ ratio = 1;
168
+ }
169
+ width = Math.floor(width * ratio);
170
+ height = Math.floor(height * ratio);
171
+ var tempCanvas = document.createElement('canvas');
172
+ tempCanvas.width = width;
173
+ tempCanvas.height = height;
174
+ var ctx = tempCanvas.getContext('2d');
175
+ isRotate = false;
176
+ if (width/height >= 4/3 && isMobile()){
177
+ tempCanvas.height = width;
178
+ tempCanvas.width = height;
179
+ ctx.clearRect(0, 0, tempCanvas.width, tempCanvas.height);
180
+ ctx.save();
181
+ ctx.translate(tempCanvas.width / 2, tempCanvas.height / 2);
182
+ ctx.rotate(Math.PI / 2);
183
+ ctx.drawImage(img, -img.width / 2, -img.height / 2);
184
+ ctx.restore();
185
+ isRotate = true;
186
+ }
187
+ else {
188
+ ctx.drawImage(img, 0, 0, width, height);
189
+ }
190
+ resizedImage.src = tempCanvas.toDataURL();
191
+ return true;
192
+ }
193
+ return false;
194
+ }
195
+
196
+ function drawImages() {
197
+ context.clearRect(0, 0, canvas.width, canvas.height);
198
+ context.putImageData(maskData,0,0);
199
+ if (selectedMode == "select") {
200
+ return;
201
+ }
202
+ context.globalAlpha = 0.75; // 设置透明度为0.5
203
+ context.drawImage(image, 0, 0);
204
+ //context.drawImage(imageMask, 0, 0);
205
+ context.globalAlpha = 1; // 恢复透明度为1
206
+ }
207
+ function drawImagesInterval(t) {
208
+ if (intervalHandel != null){
209
+ drawImagesTimeOut(100);
210
+ window.clearInterval(intervalHandel);
211
+ intervalHandel = null;
212
+ }
213
+ intervalHandel = window.setInterval(function() {drawImages();}, t);
214
+ }
215
+ window.addEventListener('scroll', function(event) {
216
+ var scrollTop = window.pageYOffset || document.documentElement.scrollTop;
217
+ var overlay = document.querySelector(".overlay");
218
+ overlay.style.top = (scrollTop + 82) + "px";
219
+ });
220
+ function stopDrawImagesInterval() {
221
+ if (intervalHandel != null){
222
+ drawImagesTimeOut(100);
223
+ window.clearInterval(intervalHandel);
224
+ intervalHandel = null;
225
+ }
226
+ }
227
+ function drawImagesTimeOut(t) {
228
+ window.setTimeout(function() {drawImages();}, t);
229
+ }
230
+ function getImageDataB(img) {
231
+ context.clearRect(0, 0, canvas.width, canvas.height);
232
+ var width = image.width;
233
+ var height = image.height;
234
+ canvas.width = width;
235
+ canvas.height = height;
236
+ context.drawImage(img, 0, 0);
237
+ var imageData = context.getImageData(0, 0, width, height);
238
+ return imageData;
239
+ }
240
+ function getImageData(img) {
241
+ var tempCanvas = document.createElement('canvas');
242
+ tempCanvas.width = canvas.width;
243
+ tempCanvas.height = canvas.height;
244
+ var tempContext = tempCanvas.getContext('2d');
245
+ var width = image.width;
246
+ var height = image.height;
247
+ tempCanvas.width = width;
248
+ tempCanvas.height = height;
249
+ tempContext.drawImage(img, 0, 0);
250
+ var imageData = tempContext.getImageData(0, 0, width, height);
251
+ return imageData;
252
+ }
253
+ function createMaskImageData(width, height) {
254
+ // 创建一个新的ImageData对象
255
+ var imageData = new ImageData(width, height);
256
+ // 获取像素数据
257
+ var data = imageData.data;
258
+ // 将每个像素设置为黑色
259
+ for (var i = 0; i < data.length; i += 4) {
260
+ data[i] = 0; // 设置红色通道
261
+ data[i + 1] = 0; // 设置绿色通道
262
+ data[i + 2] = 0; // 设置蓝色通道
263
+ data[i + 3] = 255; // 设置透明度通道(不透明)
264
+ }
265
+ return imageData;
266
+ }
267
+ function getImageDataUrl(imageData) {
268
+ var tempCanvas = document.createElement('canvas');
269
+ tempCanvas.width = canvas.width;
270
+ tempCanvas.height = canvas.height;
271
+ var tempContext = tempCanvas.getContext('2d');
272
+ tempContext.putImageData(imageData, 0, 0);
273
+ return tempCanvas.toDataURL();
274
+ }
275
+ function handleFile(file) {
276
+ var reader = new FileReader();
277
+ reader.onload = function(event) {
278
+ image.onload = function() {
279
+ var resizedImage = new Image();
280
+ resizedImage.onload = _ok;
281
+ function _ok(event){
282
+ image = resizedImage;
283
+ canvas.width = resizedImage.width;
284
+ canvas.height = resizedImage.height;
285
+ maskData = createMaskImageData(image.width,image.height);
286
+ imageMask.src = getImageDataUrl(maskData);
287
+ drawImagesTimeOut(100);
288
+ }
289
+ if (!resizeImage(image,512,resizedImage)) {
290
+ canvas.width = image.width;
291
+ canvas.height = image.height;
292
+ maskData = createMaskImageData(image.width,image.height);
293
+ imageMask.src = getImageDataUrl(maskData);
294
+ drawImagesTimeOut(100);
295
+ }
296
+ }
297
+ image.src = event.target.result;
298
+ }
299
+ reader.readAsDataURL(file);
300
+ }
301
+ // 上传图片
302
+ document.getElementById("upload").addEventListener('change', function(e) {
303
+ var file = e.target.files[0];
304
+ handleFile(file);
305
+ });
306
+
307
+ // 添加拖拽文件事件监听
308
+ document.addEventListener('dragover', function(e) {
309
+ e.preventDefault();
310
+ });
311
+ document.addEventListener('drop', function(e) {
312
+ e.preventDefault();
313
+ // 获取拖拽事件中的文件对象
314
+ var file = e.dataTransfer.files[0];
315
+ // 执行与文件上传按钮相同的操作
316
+ handleFile(file);
317
+ });
318
+
319
+ function inRect(x,y,rect){
320
+ return (
321
+ x >= rect.left &&
322
+ x <= rect.right &&
323
+ y >= rect.top &&
324
+ y <= rect.bottom
325
+ );
326
+ }
327
+ function calcCanvasOffset(e,canvas) {
328
+ var canvasRect = canvas.getBoundingClientRect();
329
+ var scaleX = canvas.width / canvasRect.width;
330
+ var scaleY = canvas.height / canvasRect.height;
331
+ var offsetX = (e.clientX - canvasRect.left) * scaleX;
332
+ var offsetY = (e.clientY - canvasRect.top) * scaleY;
333
+ return [offsetX,offsetY,scaleX,scaleY];
334
+ }
335
+ // 开始绘制
336
+ function onTouchDown(e) {
337
+ if (selectedMode == "select") {
338
+ return;
339
+ }
340
+ var canvasRect = canvas.getBoundingClientRect();
341
+ var [offsetX,offsetY,scaleX,scaleY] = calcCanvasOffset(e,canvas);
342
+ //console.log([offsetX,offsetY,scaleX,scaleY]);
343
+ if (!inRect(e.clientX,e.clientY,canvasRect)){
344
+ return;
345
+ }
346
+ if (draw(offsetX, offsetY)) {
347
+ isDrawing = true;
348
+ drawImagesInterval(100);
349
+ }
350
+ }
351
+ document.addEventListener('touchstart', function(event) {
352
+ var touch = event.touches[0];
353
+ onTouchDown(touch);
354
+ });
355
+ document.addEventListener('mousedown',function(event){
356
+ onTouchDown(event);
357
+ } );
358
+ // 结束绘制
359
+ document.addEventListener('mouseup', function() {
360
+ isDrawing = false;
361
+ stopDrawImagesInterval();
362
+ });
363
+ // 绘制中
364
+ function onMove(e) {
365
+ var [offsetX,offsetY,scaleX,scaleY] = calcCanvasOffset(e,canvas);
366
+ if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)) {
367
+ showCircle(e.clientX + window.scrollX, e.clientY + window.scrollY, scaleX);
368
+ } else {
369
+ showCircle(e.clientX + window.scrollX, e.clientY + window.scrollY, scaleX);
370
+ }
371
+ var canvasRect = canvas.getBoundingClientRect();
372
+ if (isDrawing) {
373
+ //console.log('onMove1');
374
+ if (!inRect(e.clientX,e.clientY,canvasRect)){
375
+ return;
376
+ }
377
+ draw(offsetX, offsetY);
378
+ }
379
+ }
380
+ canvas.addEventListener('touchmove', function(event) {
381
+ if (selectedMode == "select") {
382
+ return;
383
+ }
384
+ event.preventDefault();
385
+ var touch = event.touches[0];
386
+ onMove(touch);
387
+ }, { passive: false });
388
+ if (!isMobile()) {
389
+ document.addEventListener('mousemove', function(event){
390
+ onMove(event);
391
+ });
392
+ }
393
+
394
+
395
+ // 绘制函数
396
+ function draw(x, y) {
397
+ if (selectedMode == "selected") {
398
+ return false;
399
+ }
400
+ if (maskData == null) {
401
+ return false;
402
+ }
403
+ var data = maskData.data;
404
+ var brushRadius = brushSize / 2;
405
+
406
+ for (var i = -brushRadius; i <= brushRadius; i++) {
407
+ for (var j = -brushRadius; j <= brushRadius; j++) {
408
+ var pixelX = Math.round(x + i);
409
+ var pixelY = Math.round(y + j);
410
+
411
+ if (pixelX < 0 || pixelX >= canvas.width || pixelY < 0 || pixelY >= canvas.height) {
412
+ continue;
413
+ }
414
+ var distance = Math.sqrt((pixelX - x) * (pixelX - x) + (pixelY - y) * (pixelY - y));
415
+ if (distance > brushRadius) {
416
+ continue;
417
+ }
418
+ var index = (pixelY * canvas.width + pixelX) * 4;
419
+ if (selectedMode == "draw"){
420
+ data[index] = 255; // 设置红色通道为最大值,即白色
421
+ data[index + 1] = 255; // 设置绿色通道为最大值,即白色
422
+ data[index + 2] = 255;
423
+ }
424
+ else {
425
+ data[index] = 0; // 设置红色通道为最大值,即白色
426
+ data[index + 1] = 0; // 设置绿色通道为最大值,即白色
427
+ data[index + 2] = 0;
428
+ }
429
+
430
+ //data[index + 3] = 128;
431
+ }
432
+ }
433
+ //imageMask.src = getImageDataUrl(maskData);
434
+ return true;
435
+ }
436
+ function generateRandomFileName() {
437
+ var characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
438
+ var length = 10; // 文件名长度
439
+ var fileName = '';
440
+ for (var i = 0; i < length; i++) {
441
+ var randomIndex = Math.floor(Math.random() * characters.length);
442
+ fileName += characters.charAt(randomIndex);
443
+ }
444
+ return fileName;
445
+ }
446
+ function rotateImageData(imageData) {
447
+ const { width, height } = imageData;
448
+ const rotatedData = new Uint8ClampedArray(width * height * 4);
449
+
450
+ for (let y = 0; y < height; y++) {
451
+ for (let x = 0; x < width; x++) {
452
+ const srcIndex = (x + y * width) * 4;
453
+ const destIndex = ((width - x - 1) * height + y) * 4;
454
+
455
+ rotatedData[destIndex] = imageData.data[srcIndex];
456
+ rotatedData[destIndex + 1] = imageData.data[srcIndex + 1];
457
+ rotatedData[destIndex + 2] = imageData.data[srcIndex + 2];
458
+ rotatedData[destIndex + 3] = imageData.data[srcIndex + 3];
459
+ }
460
+ }
461
+
462
+ return new ImageData(rotatedData, height, width);
463
+ }
464
+
465
+ function openImageInNewTab(dataUrl) {
466
+ const newTab = window.open();
467
+ newTab.document.write('<html><body style="margin: 0;"><img src="' + dataUrl + '"></body></html>');
468
+ newTab.document.close();
469
+ }
470
+ function saveImageAsFile(dataUrl, filename) {
471
+ // 将 Data URL 转换为 Blob 对象
472
+ const blob = dataURLToBlob(dataUrl);
473
+
474
+ // 创建一个链接元素
475
+ const link = document.createElement('a');
476
+ link.href = URL.createObjectURL(blob);
477
+ link.download = filename;
478
+
479
+ // 模拟点击下载链接
480
+ link.click();
481
+
482
+ // 释放 URL 对象
483
+ URL.revokeObjectURL(link.href);
484
+ }
485
+
486
+ function dataURLToBlob(dataUrl) {
487
+ console.log(dataUrl);
488
+ const commaIndex = dataUrl.indexOf(',');
489
+ const mime = dataUrl.substring(5, commaIndex);
490
+ const base64Data = dataUrl.substring(commaIndex + 1);
491
+ const byteCharacters = atob(base64Data);
492
+ const byteNumbers = new Array(byteCharacters.length);
493
+
494
+ for (let i = 0; i < byteCharacters.length; i++) {
495
+ byteNumbers[i] = byteCharacters.charCodeAt(i);
496
+ }
497
+
498
+ const byteArray = new Uint8Array(byteNumbers);
499
+
500
+ return new Blob([byteArray], { type: mime });
501
+ }
502
+ // 保存蒙版
503
+ document.getElementById('save').addEventListener('click', function() {
504
+ var data = maskData.data;
505
+ var tempCanvas = document.createElement('canvas');
506
+ var ctx = tempCanvas.getContext('2d');
507
+ if (isRotate == true){
508
+ var rData = rotateImageData(maskData);
509
+ tempCanvas.height = maskData.width;
510
+ tempCanvas.width = maskData.height;
511
+ ctx.putImageData(rData, 0, 0);
512
+ }
513
+ else {
514
+ tempCanvas.width = canvas.width;
515
+ tempCanvas.height = canvas.height;
516
+ ctx.putImageData(maskData, 0, 0);
517
+ }
518
+ var link = document.createElement('a');
519
+ link.href = tempCanvas.toDataURL("image/jpeg", 0.9);
520
+ link.download = 'mask_' + generateRandomFileName() + '.jpg';
521
+ link.click();
522
+ var oldMode = selectedMode;
523
+ selectedMode = "select";
524
+ drawImages();
525
+ selectedMode = oldMode;
526
+ //saveImageAsFile(tempCanvas.toDataURL("image/jpeg", 0.9),'mask_' + generateRandomFileName() + '.jpg');
527
+ //openImageInNewTab(tempCanvas.toDataURL("image/jpeg", 0.9));
528
+ });
529
+ // 获取圆圈元素
530
+ var circle = document.getElementById('circle');
531
+
532
+ // 根据 brushSize 设置圆圈大小
533
+ function setCircleSize(brushSize) {
534
+ }
535
+
536
+ // 在屏幕上显示圆圈
537
+ function showCircle(x, y, scale) {
538
+ circle.style.left = (x - brushSize/scale/2) + 'px';
539
+ circle.style.top = (y - brushSize/scale/2) + 'px';
540
+ circle.style.width = (brushSize / scale) + 'px';
541
+ circle.style.height = (brushSize / scale) + 'px';
542
+ circle.classList.add('show');
543
+ circle.classList.remove('hide');
544
+
545
+ // 过一秒后隐藏圆圈
546
+ setTimeout(hideCircle, 1000);
547
+ }
548
+
549
+ // 隐藏圆圈
550
+ function hideCircle() {
551
+ circle.classList.remove('show');
552
+ circle.classList.add('hide');
553
+ }
554
+
555
+ // 手机平台点击事件处理函数
556
+ function handleTouchStart(e) {
557
+ // 只处理单指触摸事件
558
+ if (e.touches.length === 1) {
559
+ var touch = e.touches[0];
560
+ var x = touch.clientX;
561
+ var y = touch.clientY;
562
+ var [offsetX,offsetY,scaleX,scaleY] = calcCanvasOffset(touch,canvas);
563
+ // 在屏幕上显示圆圈
564
+ showCircle(x + window.scrollX, y + window.scrollY, scaleX);
565
+ }
566
+ }
567
+
568
+
569
+ // 初始化圆圈大小
570
+ setCircleSize(brushSize);
571
+ hideCircle();
572
+ // 设置事件监听
573
+ //setEventListeners();
574
+ }
575
+ </script>
576
+ </body>
577
+ </html>