kfb-view 2.1.7 → 2.1.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.idea/git_toolbox_prj.xml +15 -0
- package/.idea/workspace.xml +109 -166
- package/config/webpack.dev.conf.js +2 -2
- package/config/webpack.lib.conf.js +3 -3
- package/config/webpack.prod.conf.js +3 -3
- package/example/index.js +120 -83
- package/lib/kfb-view.js +2 -1
- package/lib/kfb-view.js.LICENSE.txt +9 -0
- package/package.json +3 -3
- package/src/components/area/index.js +32 -14
- package/src/components/board/index.js +7 -2
- package/src/components/tailoring/index.js +11 -11
- package/src/util/imageData.js +10 -6
- package/src/view.js +19 -1
package/example/index.js
CHANGED
|
@@ -1,15 +1,31 @@
|
|
|
1
|
-
import {KfbView,
|
|
1
|
+
import {KfbView, hslToRgb, rgbToHsl, cacheGammaTable} from '../src';
|
|
2
2
|
import axios from 'axios';
|
|
3
|
+
import {EVENT_TAILORING_SCREENSHOT} from '../src/const/event';
|
|
3
4
|
|
|
4
|
-
const fileName = '/upload/large_file/last/
|
|
5
|
+
const fileName = '/upload/large_file/last/2022/02/21/d31a31bf1ae5b73fca63f72e2affc879/胃镜1.kfb';
|
|
5
6
|
|
|
6
7
|
const instance = axios.create({
|
|
7
8
|
baseURL: '/api',
|
|
8
9
|
timeout: 1000,
|
|
9
|
-
headers: {'Authorization': 'bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.
|
|
10
|
+
headers: {'Authorization': 'bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJodHRwOlwvXC8xOTIuMTY4LjEuOTFcL2FwaVwvYXV0aFwvbG9naW4iLCJpYXQiOjE2NDg0NTQwNjEsImV4cCI6MTY0OTA1ODg2MSwibmJmIjoxNjQ4NDU0MDYxLCJqdGkiOiJ6WXZUNnJXVzhoQTBrUTYzIiwic3ViIjoxLCJwcnYiOiI4N2UwYWYxZWY5ZmQxNTgxMmZkZWM5NzE1M2ExNGUwYjA0NzU0NmFhIn0.qMTNZvIxSVLGfh8jFTiXKBf7BQXXuz4n2cUj7Ewj6lk'},
|
|
10
11
|
});
|
|
11
12
|
|
|
12
|
-
|
|
13
|
+
let cacheImage = {};
|
|
14
|
+
|
|
15
|
+
const debounce = (func, delay) => {
|
|
16
|
+
let timer;
|
|
17
|
+
return function(...args) {
|
|
18
|
+
if (timer) {
|
|
19
|
+
clearTimeout(timer);
|
|
20
|
+
}
|
|
21
|
+
timer = setTimeout(() => {
|
|
22
|
+
// eslint-disable-next-line no-invalid-this,babel/no-invalid-this
|
|
23
|
+
func.apply(this, args);
|
|
24
|
+
}, delay);
|
|
25
|
+
};
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
instance.get(`/slide/info?file=${fileName}`).then(({data}) => {
|
|
13
29
|
let params = {};
|
|
14
30
|
params.file = fileName;
|
|
15
31
|
const kv = new KfbView({
|
|
@@ -20,6 +36,9 @@ instance.get(`/ai/kfb/info?file=${fileName}`).then(({data}) => {
|
|
|
20
36
|
disabled: false,
|
|
21
37
|
drag: true,
|
|
22
38
|
},
|
|
39
|
+
board: {
|
|
40
|
+
ROI: true,
|
|
41
|
+
},
|
|
23
42
|
graduation: {
|
|
24
43
|
right: 30,
|
|
25
44
|
},
|
|
@@ -27,7 +46,7 @@ instance.get(`/ai/kfb/info?file=${fileName}`).then(({data}) => {
|
|
|
27
46
|
disabled: false,
|
|
28
47
|
height: 200,
|
|
29
48
|
style: 'right: 0;top: 0',
|
|
30
|
-
thumbnail: `/api/
|
|
49
|
+
thumbnail: `/api/slide/getImage?file=${fileName}&type=thumbnail`,
|
|
31
50
|
vestige: true,
|
|
32
51
|
vestigeZoom: .1,
|
|
33
52
|
},
|
|
@@ -66,15 +85,24 @@ instance.get(`/ai/kfb/info?file=${fileName}`).then(({data}) => {
|
|
|
66
85
|
},
|
|
67
86
|
},
|
|
68
87
|
tileDrawing(e) {
|
|
69
|
-
const {
|
|
88
|
+
const {
|
|
89
|
+
context,
|
|
90
|
+
rendered,
|
|
91
|
+
sourceWidth,
|
|
92
|
+
sourceHeight,
|
|
93
|
+
position,
|
|
94
|
+
size,
|
|
95
|
+
initRendered,
|
|
96
|
+
tile,
|
|
97
|
+
} = e;
|
|
70
98
|
let rangeA = document.querySelector('#a').value / 1;
|
|
99
|
+
let rangeS = document.querySelector('#s').value / 1;
|
|
100
|
+
let rangeL = document.querySelector('#l').value / 1;
|
|
101
|
+
let rangeR = document.querySelector('#r').value / 1;
|
|
102
|
+
let rangeG = document.querySelector('#g').value / 1;
|
|
71
103
|
let rangeB = document.querySelector('#b').value / 1;
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
position.y = position.y >> 0;
|
|
75
|
-
size.y = size.y >> 0;
|
|
76
|
-
size.x = size.x >> 0;
|
|
77
|
-
if (rangeB === 0 && rangeA === 1 && rangeC === 0) {
|
|
104
|
+
if (rangeB === 0 && rangeA === 1 && rangeS === 0 && rangeL === 0 &&
|
|
105
|
+
rangeR === 0 && rangeG === 0) {
|
|
78
106
|
context.drawImage(
|
|
79
107
|
rendered.canvas,
|
|
80
108
|
0,
|
|
@@ -88,64 +116,67 @@ instance.get(`/ai/kfb/info?file=${fileName}`).then(({data}) => {
|
|
|
88
116
|
);
|
|
89
117
|
return;
|
|
90
118
|
}
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
let imageData = undefined;
|
|
96
|
-
let length = isSource ? sourceLength : sizeLength;
|
|
97
|
-
if (isSource) {
|
|
98
|
-
imageData = initRendered.getImageData(0, 0, canvas.width,
|
|
99
|
-
canvas.height);
|
|
100
|
-
} else {
|
|
101
|
-
const offCanvas = new OffscreenCanvas(size.x, size.y);
|
|
102
|
-
const offCtx = offCanvas.getContext('2d');
|
|
103
|
-
offCtx.drawImage(initRendered.canvas, 0, 0, offCanvas.width,
|
|
104
|
-
offCanvas.height);
|
|
105
|
-
imageData = initRendered.getImageData(0, 0, canvas.width,
|
|
119
|
+
if (!cacheImage[tile.url]) {
|
|
120
|
+
const sourceLength = sourceWidth * sourceHeight;
|
|
121
|
+
const canvas = rendered.canvas;
|
|
122
|
+
let imageData = initRendered.getImageData(0, 0, canvas.width,
|
|
106
123
|
canvas.height);
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
124
|
+
for (let i = 0; i < sourceLength; i++) {
|
|
125
|
+
let r = imageData.data[i * 4 + 0];
|
|
126
|
+
let g = imageData.data[i * 4 + 1];
|
|
127
|
+
let b = imageData.data[i * 4 + 2];
|
|
128
|
+
if (rangeR !== 0) {
|
|
129
|
+
r = r * (1 + rangeR);
|
|
130
|
+
r = r > 255 ? 255 : r;
|
|
131
|
+
}
|
|
132
|
+
if (rangeG !== 0) {
|
|
133
|
+
g = g * (1 + rangeG);
|
|
134
|
+
g = g > 255 ? 255 : g;
|
|
135
|
+
}
|
|
136
|
+
if (rangeB !== 0) {
|
|
137
|
+
b = b * (1 + rangeB);
|
|
138
|
+
g = g > 255 ? 255 : g;
|
|
139
|
+
}
|
|
140
|
+
if (rangeS !== 0) {
|
|
141
|
+
let {h, s, l} = rgbToHsl(r, g, b);
|
|
142
|
+
const rgb = hslToRgb(h, s * (1 + rangeS), l);
|
|
143
|
+
r = rgb.r;
|
|
144
|
+
g = rgb.g;
|
|
145
|
+
b = rgb.b;
|
|
146
|
+
}
|
|
147
|
+
if (rangeL !== 0) {
|
|
148
|
+
let {h, s, l} = rgbToHsl(r, g, b);
|
|
149
|
+
const rgb = hslToRgb(h, s, l * (1 + rangeL));
|
|
150
|
+
r = rgb.r;
|
|
151
|
+
g = rgb.g;
|
|
152
|
+
b = rgb.b;
|
|
153
|
+
}
|
|
154
|
+
if (rangeA !== 1) {
|
|
155
|
+
r = cacheGammaTable[rangeA][r >> 0];
|
|
156
|
+
g = cacheGammaTable[rangeA][g >> 0];
|
|
157
|
+
b = cacheGammaTable[rangeA][b >> 0];
|
|
158
|
+
}
|
|
159
|
+
if (r > 255 || g > 255 || b > 255) {
|
|
160
|
+
console.log(r, g, b);
|
|
161
|
+
}
|
|
162
|
+
imageData.data[i * 4 + 0] = r;
|
|
163
|
+
imageData.data[i * 4 + 1] = g;
|
|
164
|
+
imageData.data[i * 4 + 2] = b;
|
|
127
165
|
}
|
|
128
|
-
imageData.data[i * 4 + 0] = r;
|
|
129
|
-
imageData.data[i * 4 + 1] = g;
|
|
130
|
-
imageData.data[i * 4 + 2] = b;
|
|
131
|
-
}
|
|
132
|
-
if (isSource) {
|
|
133
166
|
rendered.putImageData(imageData, 0, 0);
|
|
134
|
-
|
|
135
|
-
canvas,
|
|
136
|
-
0,
|
|
137
|
-
0,
|
|
138
|
-
sourceWidth,
|
|
139
|
-
sourceHeight,
|
|
140
|
-
position.x,
|
|
141
|
-
position.y,
|
|
142
|
-
size.x,
|
|
143
|
-
size.y,
|
|
144
|
-
);
|
|
145
|
-
} else {
|
|
146
|
-
context.putImageData(imageData, position.x, position.y);
|
|
147
|
-
/* context.drawImage(offCanvas, position.x, position.y, size.x, size.y);*/
|
|
167
|
+
cacheImage[tile.url] = canvas;
|
|
148
168
|
}
|
|
169
|
+
context.drawImage(
|
|
170
|
+
cacheImage[tile.url],
|
|
171
|
+
0,
|
|
172
|
+
0,
|
|
173
|
+
sourceWidth,
|
|
174
|
+
sourceHeight,
|
|
175
|
+
position.x,
|
|
176
|
+
position.y,
|
|
177
|
+
size.x,
|
|
178
|
+
size.y,
|
|
179
|
+
);
|
|
149
180
|
},
|
|
150
181
|
});
|
|
151
182
|
/* kv.board.startDraw({
|
|
@@ -153,13 +184,16 @@ instance.get(`/ai/kfb/info?file=${fileName}`).then(({data}) => {
|
|
|
153
184
|
});*/
|
|
154
185
|
console.log(kv);
|
|
155
186
|
let list = [];
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
187
|
+
document.querySelector('#a').onchange = debounce(changeRange, 500);
|
|
188
|
+
document.querySelector('#s').onchange = debounce(changeRange, 500);
|
|
189
|
+
document.querySelector('#l').onchange = debounce(changeRange, 500);
|
|
190
|
+
document.querySelector('#r').onchange = debounce(changeRange, 500);
|
|
191
|
+
document.querySelector('#g').onchange = debounce(changeRange, 500);
|
|
192
|
+
document.querySelector('#b').onchange = debounce(changeRange, 500);
|
|
160
193
|
|
|
161
194
|
// eslint-disable-next-line no-unused-vars
|
|
162
195
|
function changeRange() {
|
|
196
|
+
cacheImage = {};
|
|
163
197
|
kv.viewer.forceRedraw();
|
|
164
198
|
}
|
|
165
199
|
|
|
@@ -176,8 +210,11 @@ instance.get(`/ai/kfb/info?file=${fileName}`).then(({data}) => {
|
|
|
176
210
|
rect.onclick = () => {
|
|
177
211
|
kv.board.startDraw({
|
|
178
212
|
tool: KfbView.marks.RECTANGLE,
|
|
179
|
-
|
|
213
|
+
isROI: true,
|
|
180
214
|
once: true,
|
|
215
|
+
measure: false,
|
|
216
|
+
resize: false,
|
|
217
|
+
move: false,
|
|
181
218
|
});
|
|
182
219
|
};
|
|
183
220
|
line.onclick = () => {
|
|
@@ -258,18 +295,18 @@ instance.get(`/ai/kfb/info?file=${fileName}`).then(({data}) => {
|
|
|
258
295
|
kv.$on(KfbView.events.EVENT_CANCEL_SELECT_LABEL, (e) => {
|
|
259
296
|
// kv.board.endDraw();
|
|
260
297
|
});
|
|
261
|
-
|
|
262
|
-
kv.
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
298
|
+
const {width, height} = kv.$options;
|
|
299
|
+
kv.$on(KfbView.events.EVENT_TAILORING_SCREENSHOT, (e) => {
|
|
300
|
+
console.log(e.detail);
|
|
301
|
+
});
|
|
302
|
+
/* kv.tailoring.init(
|
|
303
|
+
{
|
|
304
|
+
left: width / 2 - 100,
|
|
305
|
+
top: height / 2 - 100,
|
|
306
|
+
height: 200,
|
|
307
|
+
width: 200,
|
|
308
|
+
color: '#F00',
|
|
309
|
+
});*/
|
|
273
310
|
setTimeout(() => {
|
|
274
311
|
// kv.destroy();
|
|
275
312
|
}, 6000);
|