med-viewer-sdk 0.1.2 → 0.1.3
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/dist/core/ColorAdjustPlugin.d.ts +24 -17
- package/dist/core/Engine.d.ts +3 -0
- package/dist/core/Magnification.d.ts +25 -0
- package/dist/med-viewer-sdk.d.ts +3 -1
- package/dist/med-viewer-sdk.mjs +1191 -20
- package/dist/med-viewer-sdk.umd.js +1 -1
- package/package.json +3 -2
- package/src/assets/icons/tool_color.png +0 -0
- package/src/assets/icons/tool_reset.png +0 -0
- package/src/core/ColorAdjustPlugin.ts +158 -228
- package/src/core/Engine.ts +19 -7
- package/src/core/Magnification.ts +261 -0
- package/src/core/Toolbar.ts +497 -36
- package/src/index.ts +5 -3
- package/src/plugins/openseadragon-filtering.js +211 -0
- package/src/types/type.d.ts +1 -0
package/dist/med-viewer-sdk.mjs
CHANGED
|
@@ -12502,6 +12502,8 @@ class AnnoAnnotator extends BaseAnnotator {
|
|
|
12502
12502
|
}
|
|
12503
12503
|
const buttonAnno = "data:image/png;base64,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";
|
|
12504
12504
|
const buttonSelection = "data:image/png;base64,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";
|
|
12505
|
+
const buttonColorAdjust = "data:image/png;base64,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";
|
|
12506
|
+
const buttonReset = "data:image/png;base64,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";
|
|
12505
12507
|
const createAnnoDropdownContent = (engine, hide) => {
|
|
12506
12508
|
const container = document.createElement("div");
|
|
12507
12509
|
container.className = "med-toolbar-dropdown-inner";
|
|
@@ -12510,7 +12512,14 @@ const createAnnoDropdownContent = (engine, hide) => {
|
|
|
12510
12512
|
colorSection.innerHTML = `<div class="med-toolbar-section-title">标注颜色</div>`;
|
|
12511
12513
|
const colorGrid = document.createElement("div");
|
|
12512
12514
|
colorGrid.className = "med-color-grid";
|
|
12513
|
-
const colors = [
|
|
12515
|
+
const colors = [
|
|
12516
|
+
"#ff0000",
|
|
12517
|
+
"#00ff00",
|
|
12518
|
+
"#0000ff",
|
|
12519
|
+
"#ffff00",
|
|
12520
|
+
"#00ffff",
|
|
12521
|
+
"#ffffff"
|
|
12522
|
+
];
|
|
12514
12523
|
colors.forEach((c) => {
|
|
12515
12524
|
const dot = document.createElement("div");
|
|
12516
12525
|
dot.className = "med-color-item";
|
|
@@ -12552,8 +12561,254 @@ const createAnnoDropdownContent = (engine, hide) => {
|
|
|
12552
12561
|
container.appendChild(toolSection);
|
|
12553
12562
|
return container;
|
|
12554
12563
|
};
|
|
12564
|
+
const debounce = (fn, delay) => {
|
|
12565
|
+
let timer = null;
|
|
12566
|
+
return (...args) => {
|
|
12567
|
+
if (timer)
|
|
12568
|
+
clearTimeout(timer);
|
|
12569
|
+
timer = window.setTimeout(() => fn(...args), delay);
|
|
12570
|
+
};
|
|
12571
|
+
};
|
|
12572
|
+
const createColorAdjustDropdownContent = (engine, hide) => {
|
|
12573
|
+
var _a;
|
|
12574
|
+
const container = document.createElement("div");
|
|
12575
|
+
container.className = "med-toolbar-dropdown-inner med-color-adjust-dropdown";
|
|
12576
|
+
const createSlider = (labelText, id, min, max, step, initialValue, onChange) => {
|
|
12577
|
+
const section = document.createElement("div");
|
|
12578
|
+
section.className = "med-toolbar-section";
|
|
12579
|
+
section.innerHTML = `<div class="med-toolbar-section-title">${labelText}</div>`;
|
|
12580
|
+
const input = document.createElement("input");
|
|
12581
|
+
input.type = "range";
|
|
12582
|
+
input.id = id;
|
|
12583
|
+
input.min = String(min);
|
|
12584
|
+
input.max = String(max);
|
|
12585
|
+
input.step = String(step);
|
|
12586
|
+
input.value = String(initialValue);
|
|
12587
|
+
const valueDisplay = document.createElement("span");
|
|
12588
|
+
valueDisplay.className = "med-slider-value";
|
|
12589
|
+
valueDisplay.textContent = String(initialValue);
|
|
12590
|
+
const debouncedOnChange = debounce(onChange, 200);
|
|
12591
|
+
input.oninput = (e) => {
|
|
12592
|
+
const value = parseFloat(e.target.value);
|
|
12593
|
+
valueDisplay.textContent = value.toFixed(2);
|
|
12594
|
+
debouncedOnChange(value);
|
|
12595
|
+
};
|
|
12596
|
+
section.appendChild(input);
|
|
12597
|
+
section.appendChild(valueDisplay);
|
|
12598
|
+
return section;
|
|
12599
|
+
};
|
|
12600
|
+
const createCheckbox = (labelText, id, initialValue, onChange) => {
|
|
12601
|
+
const section = document.createElement("div");
|
|
12602
|
+
section.className = "med-toolbar-section med-checkbox-section";
|
|
12603
|
+
const label = document.createElement("label");
|
|
12604
|
+
label.htmlFor = id;
|
|
12605
|
+
label.textContent = labelText;
|
|
12606
|
+
const input = document.createElement("input");
|
|
12607
|
+
input.type = "checkbox";
|
|
12608
|
+
input.id = id;
|
|
12609
|
+
input.checked = initialValue;
|
|
12610
|
+
input.onchange = (e) => onChange(e.target.checked);
|
|
12611
|
+
section.appendChild(label);
|
|
12612
|
+
section.appendChild(input);
|
|
12613
|
+
return section;
|
|
12614
|
+
};
|
|
12615
|
+
const currentAdjustments = ((_a = engine.colorAdjust) == null ? void 0 : _a.adjustments) || {
|
|
12616
|
+
brightness: 1,
|
|
12617
|
+
contrast: 1,
|
|
12618
|
+
saturation: 1,
|
|
12619
|
+
gamma: 1,
|
|
12620
|
+
hue: 0,
|
|
12621
|
+
invert: false,
|
|
12622
|
+
sepia: false,
|
|
12623
|
+
greyscale: false
|
|
12624
|
+
};
|
|
12625
|
+
container.appendChild(
|
|
12626
|
+
createSlider(
|
|
12627
|
+
"亮度",
|
|
12628
|
+
"brightness-slider",
|
|
12629
|
+
0,
|
|
12630
|
+
2,
|
|
12631
|
+
0.01,
|
|
12632
|
+
currentAdjustments.brightness || 1,
|
|
12633
|
+
(val) => {
|
|
12634
|
+
var _a2;
|
|
12635
|
+
return (_a2 = engine.colorAdjust) == null ? void 0 : _a2.setAdjustments({ brightness: val });
|
|
12636
|
+
}
|
|
12637
|
+
)
|
|
12638
|
+
);
|
|
12639
|
+
container.appendChild(
|
|
12640
|
+
createSlider(
|
|
12641
|
+
"对比度",
|
|
12642
|
+
"contrast-slider",
|
|
12643
|
+
0,
|
|
12644
|
+
2,
|
|
12645
|
+
0.01,
|
|
12646
|
+
currentAdjustments.contrast || 1,
|
|
12647
|
+
(val) => {
|
|
12648
|
+
var _a2;
|
|
12649
|
+
return (_a2 = engine.colorAdjust) == null ? void 0 : _a2.setAdjustments({ contrast: val });
|
|
12650
|
+
}
|
|
12651
|
+
)
|
|
12652
|
+
);
|
|
12653
|
+
container.appendChild(
|
|
12654
|
+
createSlider(
|
|
12655
|
+
"饱和度",
|
|
12656
|
+
"saturation-slider",
|
|
12657
|
+
0,
|
|
12658
|
+
3,
|
|
12659
|
+
0.01,
|
|
12660
|
+
currentAdjustments.saturation || 1,
|
|
12661
|
+
(val) => {
|
|
12662
|
+
var _a2;
|
|
12663
|
+
(_a2 = engine.colorAdjust) == null ? void 0 : _a2.setAdjustments({
|
|
12664
|
+
saturation: val,
|
|
12665
|
+
sepia: false,
|
|
12666
|
+
greyscale: false
|
|
12667
|
+
});
|
|
12668
|
+
container.querySelector("#sepia-checkbox").checked = false;
|
|
12669
|
+
container.querySelector("#greyscale-checkbox").checked = false;
|
|
12670
|
+
}
|
|
12671
|
+
)
|
|
12672
|
+
);
|
|
12673
|
+
container.appendChild(
|
|
12674
|
+
createSlider(
|
|
12675
|
+
"色相",
|
|
12676
|
+
"hue-slider",
|
|
12677
|
+
0,
|
|
12678
|
+
360,
|
|
12679
|
+
1,
|
|
12680
|
+
currentAdjustments.hue || 0,
|
|
12681
|
+
(val) => {
|
|
12682
|
+
var _a2;
|
|
12683
|
+
(_a2 = engine.colorAdjust) == null ? void 0 : _a2.setAdjustments({
|
|
12684
|
+
hue: val,
|
|
12685
|
+
sepia: false,
|
|
12686
|
+
greyscale: false
|
|
12687
|
+
});
|
|
12688
|
+
container.querySelector("#sepia-checkbox").checked = false;
|
|
12689
|
+
container.querySelector("#greyscale-checkbox").checked = false;
|
|
12690
|
+
}
|
|
12691
|
+
)
|
|
12692
|
+
);
|
|
12693
|
+
container.appendChild(
|
|
12694
|
+
createSlider(
|
|
12695
|
+
"伽马",
|
|
12696
|
+
"gamma-slider",
|
|
12697
|
+
0.1,
|
|
12698
|
+
3,
|
|
12699
|
+
0.01,
|
|
12700
|
+
currentAdjustments.gamma || 1,
|
|
12701
|
+
(val) => {
|
|
12702
|
+
var _a2;
|
|
12703
|
+
return (_a2 = engine.colorAdjust) == null ? void 0 : _a2.setAdjustments({ gamma: val });
|
|
12704
|
+
}
|
|
12705
|
+
)
|
|
12706
|
+
);
|
|
12707
|
+
container.appendChild(
|
|
12708
|
+
createCheckbox(
|
|
12709
|
+
"反色",
|
|
12710
|
+
"invert-checkbox",
|
|
12711
|
+
currentAdjustments.invert || false,
|
|
12712
|
+
(val) => {
|
|
12713
|
+
var _a2;
|
|
12714
|
+
return (_a2 = engine.colorAdjust) == null ? void 0 : _a2.setAdjustments({ invert: val });
|
|
12715
|
+
}
|
|
12716
|
+
)
|
|
12717
|
+
);
|
|
12718
|
+
container.appendChild(
|
|
12719
|
+
createCheckbox(
|
|
12720
|
+
"怀旧色调",
|
|
12721
|
+
"sepia-checkbox",
|
|
12722
|
+
currentAdjustments.sepia || false,
|
|
12723
|
+
(val) => {
|
|
12724
|
+
var _a2, _b;
|
|
12725
|
+
if (val) {
|
|
12726
|
+
(_a2 = engine.colorAdjust) == null ? void 0 : _a2.setAdjustments({
|
|
12727
|
+
sepia: true,
|
|
12728
|
+
greyscale: false,
|
|
12729
|
+
saturation: 1,
|
|
12730
|
+
hue: 0
|
|
12731
|
+
});
|
|
12732
|
+
container.querySelector("#saturation-slider").value = "1.0";
|
|
12733
|
+
container.querySelector("#hue-slider").value = "0";
|
|
12734
|
+
container.querySelector("#greyscale-checkbox").checked = false;
|
|
12735
|
+
} else {
|
|
12736
|
+
(_b = engine.colorAdjust) == null ? void 0 : _b.setAdjustments({ sepia: false });
|
|
12737
|
+
}
|
|
12738
|
+
}
|
|
12739
|
+
)
|
|
12740
|
+
);
|
|
12741
|
+
container.appendChild(
|
|
12742
|
+
createCheckbox(
|
|
12743
|
+
"灰度",
|
|
12744
|
+
"greyscale-checkbox",
|
|
12745
|
+
currentAdjustments.greyscale || false,
|
|
12746
|
+
(val) => {
|
|
12747
|
+
var _a2, _b;
|
|
12748
|
+
if (val) {
|
|
12749
|
+
(_a2 = engine.colorAdjust) == null ? void 0 : _a2.setAdjustments({
|
|
12750
|
+
greyscale: true,
|
|
12751
|
+
sepia: false,
|
|
12752
|
+
saturation: 1,
|
|
12753
|
+
hue: 0
|
|
12754
|
+
});
|
|
12755
|
+
container.querySelector("#saturation-slider").value = "1.0";
|
|
12756
|
+
container.querySelector("#hue-slider").value = "0";
|
|
12757
|
+
container.querySelector("#sepia-checkbox").checked = false;
|
|
12758
|
+
} else {
|
|
12759
|
+
(_b = engine.colorAdjust) == null ? void 0 : _b.setAdjustments({ greyscale: false });
|
|
12760
|
+
}
|
|
12761
|
+
}
|
|
12762
|
+
)
|
|
12763
|
+
);
|
|
12764
|
+
const resetButton = document.createElement("button");
|
|
12765
|
+
resetButton.className = "med-main-btn med-reset-btn";
|
|
12766
|
+
resetButton.textContent = "重置";
|
|
12767
|
+
resetButton.onclick = () => {
|
|
12768
|
+
var _a2;
|
|
12769
|
+
(_a2 = engine.colorAdjust) == null ? void 0 : _a2.reset();
|
|
12770
|
+
container.querySelector("#brightness-slider").value = "1.0";
|
|
12771
|
+
container.querySelector("#contrast-slider").value = "1.0";
|
|
12772
|
+
container.querySelector("#saturation-slider").value = "1.0";
|
|
12773
|
+
container.querySelector("#hue-slider").value = "0";
|
|
12774
|
+
container.querySelector("#gamma-slider").value = "1.0";
|
|
12775
|
+
container.querySelector("#invert-checkbox").checked = false;
|
|
12776
|
+
container.querySelector("#sepia-checkbox").checked = false;
|
|
12777
|
+
container.querySelector("#greyscale-checkbox").checked = false;
|
|
12778
|
+
container.querySelectorAll(".med-slider-value").forEach((el) => {
|
|
12779
|
+
const inputId = el.previousElementSibling.id;
|
|
12780
|
+
if (inputId === "brightness-slider" || inputId === "contrast-slider" || inputId === "saturation-slider" || inputId === "gamma-slider") {
|
|
12781
|
+
el.textContent = "1.00";
|
|
12782
|
+
} else if (inputId === "hue-slider") {
|
|
12783
|
+
el.textContent = "0";
|
|
12784
|
+
}
|
|
12785
|
+
});
|
|
12786
|
+
};
|
|
12787
|
+
container.appendChild(resetButton);
|
|
12788
|
+
return container;
|
|
12789
|
+
};
|
|
12555
12790
|
const DEFAULT_BUTTONS = [
|
|
12556
|
-
{
|
|
12791
|
+
{
|
|
12792
|
+
id: "reset",
|
|
12793
|
+
icon: buttonReset,
|
|
12794
|
+
label: "重置",
|
|
12795
|
+
onClick: (engine, hide) => {
|
|
12796
|
+
engine.viewer.viewport.goHome();
|
|
12797
|
+
hide();
|
|
12798
|
+
}
|
|
12799
|
+
},
|
|
12800
|
+
{
|
|
12801
|
+
id: "anno",
|
|
12802
|
+
icon: buttonAnno,
|
|
12803
|
+
dropdownContent: createAnnoDropdownContent,
|
|
12804
|
+
label: "标注设置"
|
|
12805
|
+
},
|
|
12806
|
+
{
|
|
12807
|
+
id: "colorAdjust",
|
|
12808
|
+
icon: buttonColorAdjust,
|
|
12809
|
+
dropdownContent: createColorAdjustDropdownContent,
|
|
12810
|
+
label: "颜色调整"
|
|
12811
|
+
},
|
|
12557
12812
|
{
|
|
12558
12813
|
id: "selection",
|
|
12559
12814
|
icon: buttonSelection,
|
|
@@ -12588,21 +12843,19 @@ class MedToolbar {
|
|
|
12588
12843
|
}
|
|
12589
12844
|
render() {
|
|
12590
12845
|
this.element.innerHTML = "";
|
|
12591
|
-
|
|
12592
|
-
|
|
12593
|
-
|
|
12594
|
-
|
|
12846
|
+
let buttonsToRender;
|
|
12847
|
+
if (this.options.buttons && this.options.buttons.length > 0) {
|
|
12848
|
+
const defaultButtonMap = new Map(
|
|
12849
|
+
DEFAULT_BUTTONS.map((btn) => [btn.id, btn])
|
|
12850
|
+
);
|
|
12851
|
+
buttonsToRender = this.options.buttons.map((userBtn) => {
|
|
12595
12852
|
const defaultBtn = defaultButtonMap.get(userBtn.id);
|
|
12596
|
-
|
|
12597
|
-
mergedButtons.push({ ...defaultBtn, ...userBtn });
|
|
12598
|
-
defaultButtonMap.delete(userBtn.id);
|
|
12599
|
-
} else {
|
|
12600
|
-
mergedButtons.push(userBtn);
|
|
12601
|
-
}
|
|
12853
|
+
return defaultBtn ? { ...defaultBtn, ...userBtn } : userBtn;
|
|
12602
12854
|
});
|
|
12855
|
+
} else {
|
|
12856
|
+
buttonsToRender = DEFAULT_BUTTONS;
|
|
12603
12857
|
}
|
|
12604
|
-
|
|
12605
|
-
mergedButtons.forEach((btnConfig) => {
|
|
12858
|
+
buttonsToRender.forEach((btnConfig) => {
|
|
12606
12859
|
const wrapper = document.createElement("div");
|
|
12607
12860
|
wrapper.className = "med-toolbar-item-wrapper";
|
|
12608
12861
|
const btn = document.createElement("button");
|
|
@@ -12635,7 +12888,10 @@ class MedToolbar {
|
|
|
12635
12888
|
showDropdown(parent, config) {
|
|
12636
12889
|
this.dropdownElement = document.createElement("div");
|
|
12637
12890
|
this.dropdownElement.className = "med-toolbar-dropdown";
|
|
12638
|
-
const content = config.dropdownContent(
|
|
12891
|
+
const content = config.dropdownContent(
|
|
12892
|
+
this.engine,
|
|
12893
|
+
() => this.closeDropdown()
|
|
12894
|
+
);
|
|
12639
12895
|
this.dropdownElement.appendChild(content);
|
|
12640
12896
|
parent.appendChild(this.dropdownElement);
|
|
12641
12897
|
this.adjustDropdownPosition();
|
|
@@ -12648,7 +12904,10 @@ class MedToolbar {
|
|
|
12648
12904
|
this.closeDropdown();
|
|
12649
12905
|
}
|
|
12650
12906
|
};
|
|
12651
|
-
setTimeout(
|
|
12907
|
+
setTimeout(
|
|
12908
|
+
() => document.addEventListener("click", this.outsideClickHandler),
|
|
12909
|
+
0
|
|
12910
|
+
);
|
|
12652
12911
|
}
|
|
12653
12912
|
adjustDropdownPosition() {
|
|
12654
12913
|
if (!this.dropdownElement)
|
|
@@ -12668,7 +12927,10 @@ class MedToolbar {
|
|
|
12668
12927
|
const isTop = (this.options.position || "").includes("TOP");
|
|
12669
12928
|
if (isTop) {
|
|
12670
12929
|
const currentTransform = this.dropdownElement.style.transform;
|
|
12671
|
-
this.dropdownElement.style.transform = currentTransform.replace(
|
|
12930
|
+
this.dropdownElement.style.transform = currentTransform.replace(
|
|
12931
|
+
"translateY(10px)",
|
|
12932
|
+
"translateY(-10px)"
|
|
12933
|
+
);
|
|
12672
12934
|
}
|
|
12673
12935
|
}
|
|
12674
12936
|
closeDropdown(immediate = false) {
|
|
@@ -12803,10 +13065,715 @@ class MedToolbar {
|
|
|
12803
13065
|
.med-tool-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 8px; }
|
|
12804
13066
|
.med-tool-item { background: rgba(255,255,255,0.05); border: 1px solid rgba(255,255,255,0.05); color: #fff; padding: 8px 4px; border-radius: 6px; cursor: pointer; font-size: 12px; transition: 0.2s; }
|
|
12805
13067
|
.med-tool-item:hover { background: rgba(49, 208, 170, 0.2); border-color: rgba(49, 208, 170, 0.4); }
|
|
13068
|
+
|
|
13069
|
+
/* 颜色调整下拉框样式 */
|
|
13070
|
+
.med-color-adjust-dropdown {
|
|
13071
|
+
min-width: 280px;
|
|
13072
|
+
}
|
|
13073
|
+
|
|
13074
|
+
.med-toolbar-section {
|
|
13075
|
+
margin-bottom: 15px;
|
|
13076
|
+
display: flex;
|
|
13077
|
+
flex-direction: column;
|
|
13078
|
+
}
|
|
13079
|
+
|
|
13080
|
+
.med-toolbar-section-title {
|
|
13081
|
+
margin-bottom: 8px;
|
|
13082
|
+
font-size: 13px;
|
|
13083
|
+
color: #f2f5f8;
|
|
13084
|
+
}
|
|
13085
|
+
|
|
13086
|
+
.med-toolbar-section input[type="range"] {
|
|
13087
|
+
width: 100%;
|
|
13088
|
+
-webkit-appearance: none;
|
|
13089
|
+
height: 4px;
|
|
13090
|
+
background: rgba(255,255,255,0.2);
|
|
13091
|
+
border-radius: 2px;
|
|
13092
|
+
outline: none;
|
|
13093
|
+
margin-top: 5px;
|
|
13094
|
+
margin-bottom: 5px;
|
|
13095
|
+
}
|
|
13096
|
+
|
|
13097
|
+
.med-toolbar-section input[type="range"]::-webkit-slider-thumb {
|
|
13098
|
+
-webkit-appearance: none;
|
|
13099
|
+
width: 16px;
|
|
13100
|
+
height: 16px;
|
|
13101
|
+
border-radius: 50%;
|
|
13102
|
+
background: #31d0aa;
|
|
13103
|
+
cursor: pointer;
|
|
13104
|
+
border: 2px solid #181c24;
|
|
13105
|
+
transition: background 0.15s ease-in-out;
|
|
13106
|
+
}
|
|
13107
|
+
|
|
13108
|
+
.med-toolbar-section input[type="range"]::-webkit-slider-thumb:hover {
|
|
13109
|
+
background: #25a084;
|
|
13110
|
+
}
|
|
13111
|
+
|
|
13112
|
+
.med-slider-value {
|
|
13113
|
+
font-size: 12px;
|
|
13114
|
+
color: rgba(255,255,255,0.7);
|
|
13115
|
+
align-self: flex-end;
|
|
13116
|
+
}
|
|
13117
|
+
|
|
13118
|
+
.med-checkbox-section {
|
|
13119
|
+
flex-direction: row;
|
|
13120
|
+
align-items: center;
|
|
13121
|
+
justify-content: space-between;
|
|
13122
|
+
margin-bottom: 10px;
|
|
13123
|
+
}
|
|
13124
|
+
|
|
13125
|
+
.med-checkbox-section label {
|
|
13126
|
+
font-size: 13px;
|
|
13127
|
+
color: #f2f5f8;
|
|
13128
|
+
cursor: pointer;
|
|
13129
|
+
}
|
|
13130
|
+
|
|
13131
|
+
.med-checkbox-section input[type="checkbox"] {
|
|
13132
|
+
-webkit-appearance: none;
|
|
13133
|
+
-moz-appearance: none;
|
|
13134
|
+
appearance: none;
|
|
13135
|
+
width: 18px;
|
|
13136
|
+
height: 18px;
|
|
13137
|
+
border: 1px solid rgba(255,255,255,0.4);
|
|
13138
|
+
border-radius: 4px;
|
|
13139
|
+
background-color: transparent;
|
|
13140
|
+
cursor: pointer;
|
|
13141
|
+
position: relative;
|
|
13142
|
+
transition: all 0.2s ease;
|
|
13143
|
+
}
|
|
13144
|
+
|
|
13145
|
+
.med-checkbox-section input[type="checkbox"]:checked {
|
|
13146
|
+
background-color: #31d0aa;
|
|
13147
|
+
border-color: #31d0aa;
|
|
13148
|
+
}
|
|
13149
|
+
|
|
13150
|
+
.med-checkbox-section input[type="checkbox"]:checked::after {
|
|
13151
|
+
content: '';
|
|
13152
|
+
position: absolute;
|
|
13153
|
+
left: 5px;
|
|
13154
|
+
top: 2px;
|
|
13155
|
+
width: 4px;
|
|
13156
|
+
height: 9px;
|
|
13157
|
+
border: solid white;
|
|
13158
|
+
border-width: 0 2px 2px 0;
|
|
13159
|
+
transform: rotate(45deg);
|
|
13160
|
+
}
|
|
13161
|
+
|
|
13162
|
+
.med-reset-btn {
|
|
13163
|
+
width: 100%;
|
|
13164
|
+
margin-top: 15px;
|
|
13165
|
+
background: rgba(200, 50, 50, 0.1);
|
|
13166
|
+
color: #ff6b6b;
|
|
13167
|
+
border: 1px solid rgba(255, 100, 100, 0.2);
|
|
13168
|
+
}
|
|
13169
|
+
.med-reset-btn:hover {
|
|
13170
|
+
background: rgba(200, 50, 50, 0.3);
|
|
13171
|
+
}
|
|
12806
13172
|
`;
|
|
12807
13173
|
document.head.appendChild(style);
|
|
12808
13174
|
}
|
|
12809
13175
|
}
|
|
13176
|
+
(function() {
|
|
13177
|
+
var $ = window.OpenSeadragon;
|
|
13178
|
+
if (!$) {
|
|
13179
|
+
$ = OpenSeadragon;
|
|
13180
|
+
if (!$) {
|
|
13181
|
+
throw new Error("OpenSeadragon is missing.");
|
|
13182
|
+
}
|
|
13183
|
+
}
|
|
13184
|
+
if (!$.version || $.version.major < 2 || $.version.major === 2 && $.version.minor < 1) {
|
|
13185
|
+
throw new Error(
|
|
13186
|
+
"Filtering plugin requires OpenSeadragon version >= 2.1"
|
|
13187
|
+
);
|
|
13188
|
+
}
|
|
13189
|
+
$.Viewer.prototype.setFilterOptions = function(options) {
|
|
13190
|
+
if (!this.filterPluginInstance) {
|
|
13191
|
+
options = options || {};
|
|
13192
|
+
options.viewer = this;
|
|
13193
|
+
this.filterPluginInstance = new $.FilterPlugin(options);
|
|
13194
|
+
} else {
|
|
13195
|
+
setOptions(this.filterPluginInstance, options);
|
|
13196
|
+
}
|
|
13197
|
+
};
|
|
13198
|
+
$.FilterPlugin = function(options) {
|
|
13199
|
+
options = options || {};
|
|
13200
|
+
if (!options.viewer) {
|
|
13201
|
+
throw new Error("A viewer must be specified.");
|
|
13202
|
+
}
|
|
13203
|
+
var self2 = this;
|
|
13204
|
+
this.viewer = options.viewer;
|
|
13205
|
+
this.viewer.addHandler("tile-loaded", tileLoadedHandler);
|
|
13206
|
+
this.viewer.addHandler("tile-drawing", tileDrawingHandler);
|
|
13207
|
+
this.filterIncrement = 0;
|
|
13208
|
+
setOptions(this, options);
|
|
13209
|
+
function tileLoadedHandler(event2) {
|
|
13210
|
+
var processors = getFiltersProcessors(self2, event2.tiledImage);
|
|
13211
|
+
if (processors.length === 0) {
|
|
13212
|
+
return;
|
|
13213
|
+
}
|
|
13214
|
+
var tile = event2.tile;
|
|
13215
|
+
var image = event2.image;
|
|
13216
|
+
if (image !== null && image !== void 0) {
|
|
13217
|
+
var canvas = window.document.createElement("canvas");
|
|
13218
|
+
canvas.width = image.width;
|
|
13219
|
+
canvas.height = image.height;
|
|
13220
|
+
var context = canvas.getContext("2d");
|
|
13221
|
+
context.drawImage(image, 0, 0);
|
|
13222
|
+
tile._renderedContext = context;
|
|
13223
|
+
var callback = event2.getCompletionCallback();
|
|
13224
|
+
applyFilters(context, processors, callback);
|
|
13225
|
+
tile._filterIncrement = self2.filterIncrement;
|
|
13226
|
+
}
|
|
13227
|
+
}
|
|
13228
|
+
function applyFilters(context, filtersProcessors, callback) {
|
|
13229
|
+
if (callback) {
|
|
13230
|
+
var currentIncrement = self2.filterIncrement;
|
|
13231
|
+
var callbacks = [];
|
|
13232
|
+
for (var i = 0; i < filtersProcessors.length - 1; i++) {
|
|
13233
|
+
(function(i2) {
|
|
13234
|
+
callbacks[i2] = function() {
|
|
13235
|
+
if (self2.filterIncrement !== currentIncrement) {
|
|
13236
|
+
return;
|
|
13237
|
+
}
|
|
13238
|
+
filtersProcessors[i2 + 1](context, callbacks[i2 + 1]);
|
|
13239
|
+
};
|
|
13240
|
+
})(i);
|
|
13241
|
+
}
|
|
13242
|
+
callbacks[filtersProcessors.length - 1] = function() {
|
|
13243
|
+
if (self2.filterIncrement !== currentIncrement) {
|
|
13244
|
+
return;
|
|
13245
|
+
}
|
|
13246
|
+
callback();
|
|
13247
|
+
};
|
|
13248
|
+
filtersProcessors[0](context, callbacks[0]);
|
|
13249
|
+
} else {
|
|
13250
|
+
for (var i = 0; i < filtersProcessors.length; i++) {
|
|
13251
|
+
filtersProcessors[i](context, function() {
|
|
13252
|
+
});
|
|
13253
|
+
}
|
|
13254
|
+
}
|
|
13255
|
+
}
|
|
13256
|
+
function tileDrawingHandler(event2) {
|
|
13257
|
+
var tile = event2.tile;
|
|
13258
|
+
var rendered = event2.rendered;
|
|
13259
|
+
if (rendered._filterIncrement === self2.filterIncrement) {
|
|
13260
|
+
return;
|
|
13261
|
+
}
|
|
13262
|
+
var processors = getFiltersProcessors(self2, event2.tiledImage);
|
|
13263
|
+
if (processors.length === 0) {
|
|
13264
|
+
if (rendered._originalImageData) {
|
|
13265
|
+
rendered.putImageData(rendered._originalImageData, 0, 0);
|
|
13266
|
+
delete rendered._originalImageData;
|
|
13267
|
+
}
|
|
13268
|
+
rendered._filterIncrement = self2.filterIncrement;
|
|
13269
|
+
return;
|
|
13270
|
+
}
|
|
13271
|
+
if (rendered._originalImageData) {
|
|
13272
|
+
rendered.putImageData(rendered._originalImageData, 0, 0);
|
|
13273
|
+
} else {
|
|
13274
|
+
rendered._originalImageData = rendered.getImageData(
|
|
13275
|
+
0,
|
|
13276
|
+
0,
|
|
13277
|
+
rendered.canvas.width,
|
|
13278
|
+
rendered.canvas.height
|
|
13279
|
+
);
|
|
13280
|
+
}
|
|
13281
|
+
if (tile._renderedContext) {
|
|
13282
|
+
if (tile._filterIncrement === self2.filterIncrement) {
|
|
13283
|
+
var imgData = tile._renderedContext.getImageData(
|
|
13284
|
+
0,
|
|
13285
|
+
0,
|
|
13286
|
+
tile._renderedContext.canvas.width,
|
|
13287
|
+
tile._renderedContext.canvas.height
|
|
13288
|
+
);
|
|
13289
|
+
rendered.putImageData(imgData, 0, 0);
|
|
13290
|
+
delete tile._renderedContext;
|
|
13291
|
+
delete tile._filterIncrement;
|
|
13292
|
+
rendered._filterIncrement = self2.filterIncrement;
|
|
13293
|
+
return;
|
|
13294
|
+
}
|
|
13295
|
+
delete tile._renderedContext;
|
|
13296
|
+
delete tile._filterIncrement;
|
|
13297
|
+
}
|
|
13298
|
+
applyFilters(rendered, processors);
|
|
13299
|
+
rendered._filterIncrement = self2.filterIncrement;
|
|
13300
|
+
}
|
|
13301
|
+
};
|
|
13302
|
+
function setOptions(instance, options) {
|
|
13303
|
+
options = options || {};
|
|
13304
|
+
var filters = options.filters;
|
|
13305
|
+
instance.filters = !filters ? [] : $.isArray(filters) ? filters : [filters];
|
|
13306
|
+
for (var i = 0; i < instance.filters.length; i++) {
|
|
13307
|
+
var filter = instance.filters[i];
|
|
13308
|
+
if (!filter.processors) {
|
|
13309
|
+
throw new Error("Filter processors must be specified.");
|
|
13310
|
+
}
|
|
13311
|
+
filter.processors = $.isArray(filter.processors) ? filter.processors : [filter.processors];
|
|
13312
|
+
}
|
|
13313
|
+
instance.filterIncrement++;
|
|
13314
|
+
if (options.loadMode === "sync") {
|
|
13315
|
+
instance.viewer.forceRedraw();
|
|
13316
|
+
} else {
|
|
13317
|
+
var itemsToReset = [];
|
|
13318
|
+
for (var i = 0; i < instance.filters.length; i++) {
|
|
13319
|
+
var filter = instance.filters[i];
|
|
13320
|
+
if (!filter.items) {
|
|
13321
|
+
itemsToReset = getAllItems(instance.viewer.world);
|
|
13322
|
+
break;
|
|
13323
|
+
}
|
|
13324
|
+
if ($.isArray(filter.items)) {
|
|
13325
|
+
for (var j = 0; j < filter.items.length; j++) {
|
|
13326
|
+
addItemToReset(filter.items[j], itemsToReset);
|
|
13327
|
+
}
|
|
13328
|
+
} else {
|
|
13329
|
+
addItemToReset(filter.items, itemsToReset);
|
|
13330
|
+
}
|
|
13331
|
+
}
|
|
13332
|
+
for (var i = 0; i < itemsToReset.length; i++) {
|
|
13333
|
+
itemsToReset[i].reset();
|
|
13334
|
+
}
|
|
13335
|
+
}
|
|
13336
|
+
}
|
|
13337
|
+
function addItemToReset(item, itemsToReset) {
|
|
13338
|
+
if (itemsToReset.indexOf(item) >= 0) {
|
|
13339
|
+
throw new Error("An item can not have filters assigned multiple times.");
|
|
13340
|
+
}
|
|
13341
|
+
itemsToReset.push(item);
|
|
13342
|
+
}
|
|
13343
|
+
function getAllItems(world) {
|
|
13344
|
+
var result = [];
|
|
13345
|
+
for (var i = 0; i < world.getItemCount(); i++) {
|
|
13346
|
+
result.push(world.getItemAt(i));
|
|
13347
|
+
}
|
|
13348
|
+
return result;
|
|
13349
|
+
}
|
|
13350
|
+
function getFiltersProcessors(instance, item) {
|
|
13351
|
+
if (instance.filters.length === 0) {
|
|
13352
|
+
return [];
|
|
13353
|
+
}
|
|
13354
|
+
var globalProcessors = null;
|
|
13355
|
+
for (var i = 0; i < instance.filters.length; i++) {
|
|
13356
|
+
var filter = instance.filters[i];
|
|
13357
|
+
if (!filter.items) {
|
|
13358
|
+
globalProcessors = filter.processors;
|
|
13359
|
+
} else if (filter.items === item || $.isArray(filter.items) && filter.items.indexOf(item) >= 0) {
|
|
13360
|
+
return filter.processors;
|
|
13361
|
+
}
|
|
13362
|
+
}
|
|
13363
|
+
return globalProcessors ? globalProcessors : [];
|
|
13364
|
+
}
|
|
13365
|
+
$.Filters = {
|
|
13366
|
+
THRESHOLDING: function(threshold) {
|
|
13367
|
+
if (threshold < 0 || threshold > 255) {
|
|
13368
|
+
throw new Error("Threshold must be between 0 and 255.");
|
|
13369
|
+
}
|
|
13370
|
+
return function(context, callback) {
|
|
13371
|
+
var imgData = context.getImageData(
|
|
13372
|
+
0,
|
|
13373
|
+
0,
|
|
13374
|
+
context.canvas.width,
|
|
13375
|
+
context.canvas.height
|
|
13376
|
+
);
|
|
13377
|
+
var pixels = imgData.data;
|
|
13378
|
+
for (var i = 0; i < pixels.length; i += 4) {
|
|
13379
|
+
var r = pixels[i];
|
|
13380
|
+
var g = pixels[i + 1];
|
|
13381
|
+
var b = pixels[i + 2];
|
|
13382
|
+
var v = (r + g + b) / 3;
|
|
13383
|
+
pixels[i] = pixels[i + 1] = pixels[i + 2] = v < threshold ? 0 : 255;
|
|
13384
|
+
}
|
|
13385
|
+
context.putImageData(imgData, 0, 0);
|
|
13386
|
+
callback();
|
|
13387
|
+
};
|
|
13388
|
+
},
|
|
13389
|
+
BRIGHTNESS: function(adjustment) {
|
|
13390
|
+
if (adjustment < -255 || adjustment > 255) {
|
|
13391
|
+
throw new Error(
|
|
13392
|
+
"Brightness adjustment must be between -255 and 255."
|
|
13393
|
+
);
|
|
13394
|
+
}
|
|
13395
|
+
var precomputedBrightness = [];
|
|
13396
|
+
for (var i = 0; i < 256; i++) {
|
|
13397
|
+
precomputedBrightness[i] = i + adjustment;
|
|
13398
|
+
}
|
|
13399
|
+
return function(context, callback) {
|
|
13400
|
+
var imgData = context.getImageData(
|
|
13401
|
+
0,
|
|
13402
|
+
0,
|
|
13403
|
+
context.canvas.width,
|
|
13404
|
+
context.canvas.height
|
|
13405
|
+
);
|
|
13406
|
+
var pixels = imgData.data;
|
|
13407
|
+
for (var i2 = 0; i2 < pixels.length; i2 += 4) {
|
|
13408
|
+
pixels[i2] = precomputedBrightness[pixels[i2]];
|
|
13409
|
+
pixels[i2 + 1] = precomputedBrightness[pixels[i2 + 1]];
|
|
13410
|
+
pixels[i2 + 2] = precomputedBrightness[pixels[i2 + 2]];
|
|
13411
|
+
}
|
|
13412
|
+
context.putImageData(imgData, 0, 0);
|
|
13413
|
+
callback();
|
|
13414
|
+
};
|
|
13415
|
+
},
|
|
13416
|
+
CONTRAST: function(adjustment) {
|
|
13417
|
+
if (adjustment < 0) {
|
|
13418
|
+
throw new Error("Contrast adjustment must be positive.");
|
|
13419
|
+
}
|
|
13420
|
+
var precomputedContrast = [];
|
|
13421
|
+
for (var i = 0; i < 256; i++) {
|
|
13422
|
+
precomputedContrast[i] = i * adjustment;
|
|
13423
|
+
}
|
|
13424
|
+
return function(context, callback) {
|
|
13425
|
+
var imgData = context.getImageData(
|
|
13426
|
+
0,
|
|
13427
|
+
0,
|
|
13428
|
+
context.canvas.width,
|
|
13429
|
+
context.canvas.height
|
|
13430
|
+
);
|
|
13431
|
+
var pixels = imgData.data;
|
|
13432
|
+
for (var i2 = 0; i2 < pixels.length; i2 += 4) {
|
|
13433
|
+
pixels[i2] = precomputedContrast[pixels[i2]];
|
|
13434
|
+
pixels[i2 + 1] = precomputedContrast[pixels[i2 + 1]];
|
|
13435
|
+
pixels[i2 + 2] = precomputedContrast[pixels[i2 + 2]];
|
|
13436
|
+
}
|
|
13437
|
+
context.putImageData(imgData, 0, 0);
|
|
13438
|
+
callback();
|
|
13439
|
+
};
|
|
13440
|
+
},
|
|
13441
|
+
GAMMA: function(adjustment) {
|
|
13442
|
+
if (adjustment < 0) {
|
|
13443
|
+
throw new Error("Gamma adjustment must be positive.");
|
|
13444
|
+
}
|
|
13445
|
+
var precomputedGamma = [];
|
|
13446
|
+
for (var i = 0; i < 256; i++) {
|
|
13447
|
+
precomputedGamma[i] = Math.pow(i / 255, adjustment) * 255;
|
|
13448
|
+
}
|
|
13449
|
+
return function(context, callback) {
|
|
13450
|
+
var imgData = context.getImageData(
|
|
13451
|
+
0,
|
|
13452
|
+
0,
|
|
13453
|
+
context.canvas.width,
|
|
13454
|
+
context.canvas.height
|
|
13455
|
+
);
|
|
13456
|
+
var pixels = imgData.data;
|
|
13457
|
+
for (var i2 = 0; i2 < pixels.length; i2 += 4) {
|
|
13458
|
+
pixels[i2] = precomputedGamma[pixels[i2]];
|
|
13459
|
+
pixels[i2 + 1] = precomputedGamma[pixels[i2 + 1]];
|
|
13460
|
+
pixels[i2 + 2] = precomputedGamma[pixels[i2 + 2]];
|
|
13461
|
+
}
|
|
13462
|
+
context.putImageData(imgData, 0, 0);
|
|
13463
|
+
callback();
|
|
13464
|
+
};
|
|
13465
|
+
},
|
|
13466
|
+
GREYSCALE: function() {
|
|
13467
|
+
return function(context, callback) {
|
|
13468
|
+
var imgData = context.getImageData(
|
|
13469
|
+
0,
|
|
13470
|
+
0,
|
|
13471
|
+
context.canvas.width,
|
|
13472
|
+
context.canvas.height
|
|
13473
|
+
);
|
|
13474
|
+
var pixels = imgData.data;
|
|
13475
|
+
for (var i = 0; i < pixels.length; i += 4) {
|
|
13476
|
+
var val = (pixels[i] + pixels[i + 1] + pixels[i + 2]) / 3;
|
|
13477
|
+
pixels[i] = val;
|
|
13478
|
+
pixels[i + 1] = val;
|
|
13479
|
+
pixels[i + 2] = val;
|
|
13480
|
+
}
|
|
13481
|
+
context.putImageData(imgData, 0, 0);
|
|
13482
|
+
callback();
|
|
13483
|
+
};
|
|
13484
|
+
},
|
|
13485
|
+
INVERT: function() {
|
|
13486
|
+
var precomputedInvert = [];
|
|
13487
|
+
for (var i = 0; i < 256; i++) {
|
|
13488
|
+
precomputedInvert[i] = 255 - i;
|
|
13489
|
+
}
|
|
13490
|
+
return function(context, callback) {
|
|
13491
|
+
var imgData = context.getImageData(
|
|
13492
|
+
0,
|
|
13493
|
+
0,
|
|
13494
|
+
context.canvas.width,
|
|
13495
|
+
context.canvas.height
|
|
13496
|
+
);
|
|
13497
|
+
var pixels = imgData.data;
|
|
13498
|
+
for (var i2 = 0; i2 < pixels.length; i2 += 4) {
|
|
13499
|
+
pixels[i2] = precomputedInvert[pixels[i2]];
|
|
13500
|
+
pixels[i2 + 1] = precomputedInvert[pixels[i2 + 1]];
|
|
13501
|
+
pixels[i2 + 2] = precomputedInvert[pixels[i2 + 2]];
|
|
13502
|
+
}
|
|
13503
|
+
context.putImageData(imgData, 0, 0);
|
|
13504
|
+
callback();
|
|
13505
|
+
};
|
|
13506
|
+
},
|
|
13507
|
+
MORPHOLOGICAL_OPERATION: function(kernelSize, comparator) {
|
|
13508
|
+
if (kernelSize % 2 === 0) {
|
|
13509
|
+
throw new Error("The kernel size must be an odd number.");
|
|
13510
|
+
}
|
|
13511
|
+
var kernelHalfSize = Math.floor(kernelSize / 2);
|
|
13512
|
+
if (!comparator) {
|
|
13513
|
+
throw new Error("A comparator must be defined.");
|
|
13514
|
+
}
|
|
13515
|
+
return function(context, callback) {
|
|
13516
|
+
var width = context.canvas.width;
|
|
13517
|
+
var height = context.canvas.height;
|
|
13518
|
+
var imgData = context.getImageData(0, 0, width, height);
|
|
13519
|
+
var originalPixels = context.getImageData(0, 0, width, height).data;
|
|
13520
|
+
var offset;
|
|
13521
|
+
for (var y = 0; y < height; y++) {
|
|
13522
|
+
for (var x = 0; x < width; x++) {
|
|
13523
|
+
offset = (y * width + x) * 4;
|
|
13524
|
+
var r = originalPixels[offset];
|
|
13525
|
+
var g = originalPixels[offset + 1];
|
|
13526
|
+
var b = originalPixels[offset + 2];
|
|
13527
|
+
for (var j = 0; j < kernelSize; j++) {
|
|
13528
|
+
for (var i = 0; i < kernelSize; i++) {
|
|
13529
|
+
var pixelX = x + i - kernelHalfSize;
|
|
13530
|
+
var pixelY = y + j - kernelHalfSize;
|
|
13531
|
+
if (pixelX >= 0 && pixelX < width && pixelY >= 0 && pixelY < height) {
|
|
13532
|
+
offset = (pixelY * width + pixelX) * 4;
|
|
13533
|
+
r = comparator(originalPixels[offset], r);
|
|
13534
|
+
g = comparator(
|
|
13535
|
+
originalPixels[offset + 1],
|
|
13536
|
+
g
|
|
13537
|
+
);
|
|
13538
|
+
b = comparator(
|
|
13539
|
+
originalPixels[offset + 2],
|
|
13540
|
+
b
|
|
13541
|
+
);
|
|
13542
|
+
}
|
|
13543
|
+
}
|
|
13544
|
+
}
|
|
13545
|
+
imgData.data[offset] = r;
|
|
13546
|
+
imgData.data[offset + 1] = g;
|
|
13547
|
+
imgData.data[offset + 2] = b;
|
|
13548
|
+
}
|
|
13549
|
+
}
|
|
13550
|
+
context.putImageData(imgData, 0, 0);
|
|
13551
|
+
callback();
|
|
13552
|
+
};
|
|
13553
|
+
},
|
|
13554
|
+
CONVOLUTION: function(kernel) {
|
|
13555
|
+
if (!$.isArray(kernel)) {
|
|
13556
|
+
throw new Error("The kernel must be an array.");
|
|
13557
|
+
}
|
|
13558
|
+
var kernelSize = Math.sqrt(kernel.length);
|
|
13559
|
+
if ((kernelSize + 1) % 2 !== 0) {
|
|
13560
|
+
throw new Error("The kernel must be a square matrix with oddwidth and height.");
|
|
13561
|
+
}
|
|
13562
|
+
var kernelHalfSize = (kernelSize - 1) / 2;
|
|
13563
|
+
return function(context, callback) {
|
|
13564
|
+
var width = context.canvas.width;
|
|
13565
|
+
var height = context.canvas.height;
|
|
13566
|
+
var imgData = context.getImageData(0, 0, width, height);
|
|
13567
|
+
var originalPixels = context.getImageData(0, 0, width, height).data;
|
|
13568
|
+
var offset;
|
|
13569
|
+
for (var y = 0; y < height; y++) {
|
|
13570
|
+
for (var x = 0; x < width; x++) {
|
|
13571
|
+
var r = 0;
|
|
13572
|
+
var g = 0;
|
|
13573
|
+
var b = 0;
|
|
13574
|
+
for (var j = 0; j < kernelSize; j++) {
|
|
13575
|
+
for (var i = 0; i < kernelSize; i++) {
|
|
13576
|
+
var pixelX = x + i - kernelHalfSize;
|
|
13577
|
+
var pixelY = y + j - kernelHalfSize;
|
|
13578
|
+
if (pixelX >= 0 && pixelX < width && pixelY >= 0 && pixelY < height) {
|
|
13579
|
+
offset = (pixelY * width + pixelX) * 4;
|
|
13580
|
+
var weight = kernel[j * kernelSize + i];
|
|
13581
|
+
r += originalPixels[offset] * weight;
|
|
13582
|
+
g += originalPixels[offset + 1] * weight;
|
|
13583
|
+
b += originalPixels[offset + 2] * weight;
|
|
13584
|
+
}
|
|
13585
|
+
}
|
|
13586
|
+
}
|
|
13587
|
+
offset = (y * width + x) * 4;
|
|
13588
|
+
imgData.data[offset] = r;
|
|
13589
|
+
imgData.data[offset + 1] = g;
|
|
13590
|
+
imgData.data[offset + 2] = b;
|
|
13591
|
+
}
|
|
13592
|
+
}
|
|
13593
|
+
context.putImageData(imgData, 0, 0);
|
|
13594
|
+
callback();
|
|
13595
|
+
};
|
|
13596
|
+
},
|
|
13597
|
+
COLORMAP: function(cmap, ctr) {
|
|
13598
|
+
var resampledCmap = cmap.slice(0);
|
|
13599
|
+
var diff = 255 - ctr;
|
|
13600
|
+
for (var i = 0; i < 256; i++) {
|
|
13601
|
+
var position = 0;
|
|
13602
|
+
if (i > ctr) {
|
|
13603
|
+
position = Math.min((i - ctr) / diff * 128 + 128, 255) | 0;
|
|
13604
|
+
} else {
|
|
13605
|
+
position = Math.max(0, i / (ctr / 128)) | 0;
|
|
13606
|
+
}
|
|
13607
|
+
resampledCmap[i] = cmap[position];
|
|
13608
|
+
}
|
|
13609
|
+
return function(context, callback) {
|
|
13610
|
+
var imgData = context.getImageData(
|
|
13611
|
+
0,
|
|
13612
|
+
0,
|
|
13613
|
+
context.canvas.width,
|
|
13614
|
+
context.canvas.height
|
|
13615
|
+
);
|
|
13616
|
+
var pxl = imgData.data;
|
|
13617
|
+
for (var i2 = 0; i2 < pxl.length; i2 += 4) {
|
|
13618
|
+
var v = (pxl[i2] + pxl[i2 + 1] + pxl[i2 + 2]) / 3 | 0;
|
|
13619
|
+
var c = resampledCmap[v];
|
|
13620
|
+
pxl[i2] = c[0];
|
|
13621
|
+
pxl[i2 + 1] = c[1];
|
|
13622
|
+
pxl[i2 + 2] = c[2];
|
|
13623
|
+
}
|
|
13624
|
+
context.putImageData(imgData, 0, 0);
|
|
13625
|
+
callback();
|
|
13626
|
+
};
|
|
13627
|
+
}
|
|
13628
|
+
};
|
|
13629
|
+
})();
|
|
13630
|
+
class ColorAdjustPlugin {
|
|
13631
|
+
constructor(engine, options) {
|
|
13632
|
+
__publicField(this, "viewer");
|
|
13633
|
+
__publicField(this, "_adjustments");
|
|
13634
|
+
__publicField(this, "debounceTimer", null);
|
|
13635
|
+
__publicField(this, "debounceMs");
|
|
13636
|
+
__publicField(this, "loadMode");
|
|
13637
|
+
/**
|
|
13638
|
+
* 核心算法:单次循环处理所有滤镜 (高性能模式)
|
|
13639
|
+
*/
|
|
13640
|
+
__publicField(this, "combinedProcessor", (context, callback) => {
|
|
13641
|
+
const width = context.canvas.width;
|
|
13642
|
+
const height = context.canvas.height;
|
|
13643
|
+
if (width <= 0 || height <= 0)
|
|
13644
|
+
return callback();
|
|
13645
|
+
const imageData = context.getImageData(0, 0, width, height);
|
|
13646
|
+
const data = imageData.data;
|
|
13647
|
+
const adj = this.adjustments;
|
|
13648
|
+
const invGamma = 1 / (adj.gamma || 1);
|
|
13649
|
+
259 * ((adj.contrast || 1) * 255 + 255) / (255 * (259 - (adj.contrast || 1) * 255));
|
|
13650
|
+
for (let i = 0; i < data.length; i += 4) {
|
|
13651
|
+
let r = data[i];
|
|
13652
|
+
let g = data[i + 1];
|
|
13653
|
+
let b = data[i + 2];
|
|
13654
|
+
if (adj.invert) {
|
|
13655
|
+
r = 255 - r;
|
|
13656
|
+
g = 255 - g;
|
|
13657
|
+
b = 255 - b;
|
|
13658
|
+
}
|
|
13659
|
+
if (adj.brightness !== 1) {
|
|
13660
|
+
r *= adj.brightness;
|
|
13661
|
+
g *= adj.brightness;
|
|
13662
|
+
b *= adj.brightness;
|
|
13663
|
+
}
|
|
13664
|
+
if (adj.contrast !== 1) {
|
|
13665
|
+
r = (r - 128) * adj.contrast + 128;
|
|
13666
|
+
g = (g - 128) * adj.contrast + 128;
|
|
13667
|
+
b = (b - 128) * adj.contrast + 128;
|
|
13668
|
+
}
|
|
13669
|
+
if (adj.gamma !== 1) {
|
|
13670
|
+
r = 255 * Math.pow(r / 255, invGamma);
|
|
13671
|
+
g = 255 * Math.pow(g / 255, invGamma);
|
|
13672
|
+
b = 255 * Math.pow(b / 255, invGamma);
|
|
13673
|
+
}
|
|
13674
|
+
if (adj.greyscale) {
|
|
13675
|
+
const avg = 0.2126 * r + 0.7152 * g + 0.0722 * b;
|
|
13676
|
+
r = g = b = avg;
|
|
13677
|
+
} else if (adj.sepia) {
|
|
13678
|
+
const tr = 0.393 * r + 0.769 * g + 0.189 * b;
|
|
13679
|
+
const tg = 0.349 * r + 0.686 * g + 0.168 * b;
|
|
13680
|
+
const tb = 0.272 * r + 0.534 * g + 0.131 * b;
|
|
13681
|
+
r = tr;
|
|
13682
|
+
g = tg;
|
|
13683
|
+
b = tb;
|
|
13684
|
+
} else if (adj.saturation !== 1) {
|
|
13685
|
+
const gray = 0.2989 * r + 0.587 * g + 0.114 * b;
|
|
13686
|
+
r = gray + (r - gray) * adj.saturation;
|
|
13687
|
+
g = gray + (g - gray) * adj.saturation;
|
|
13688
|
+
b = gray + (b - gray) * adj.saturation;
|
|
13689
|
+
}
|
|
13690
|
+
data[i] = Math.min(255, Math.max(0, r));
|
|
13691
|
+
data[i + 1] = Math.min(255, Math.max(0, g));
|
|
13692
|
+
data[i + 2] = Math.min(255, Math.max(0, b));
|
|
13693
|
+
}
|
|
13694
|
+
context.putImageData(imageData, 0, 0);
|
|
13695
|
+
callback();
|
|
13696
|
+
});
|
|
13697
|
+
this.viewer = engine.viewer || engine;
|
|
13698
|
+
this._adjustments = {
|
|
13699
|
+
brightness: 1,
|
|
13700
|
+
contrast: 1,
|
|
13701
|
+
saturation: 1,
|
|
13702
|
+
gamma: 1,
|
|
13703
|
+
hue: 0,
|
|
13704
|
+
invert: false,
|
|
13705
|
+
sepia: false,
|
|
13706
|
+
greyscale: false,
|
|
13707
|
+
...options == null ? void 0 : options.adjustments
|
|
13708
|
+
};
|
|
13709
|
+
console.log("ColorAdjustPlugin initialized with adjustments:", this.adjustments);
|
|
13710
|
+
this.debounceMs = (options == null ? void 0 : options.debounceMs) || 200;
|
|
13711
|
+
this.loadMode = (options == null ? void 0 : options.loadMode) || "async";
|
|
13712
|
+
this.viewer.addHandler("open", () => this.apply());
|
|
13713
|
+
if (this.viewer.isOpen())
|
|
13714
|
+
this.apply();
|
|
13715
|
+
}
|
|
13716
|
+
get adjustments() {
|
|
13717
|
+
return this._adjustments;
|
|
13718
|
+
}
|
|
13719
|
+
destroy() {
|
|
13720
|
+
if (this.debounceTimer) {
|
|
13721
|
+
window.clearTimeout(this.debounceTimer);
|
|
13722
|
+
this.debounceTimer = null;
|
|
13723
|
+
}
|
|
13724
|
+
if (this.viewer) {
|
|
13725
|
+
this.viewer.removeHandler("open", this.apply());
|
|
13726
|
+
if (this.viewer.setFilterOptions) {
|
|
13727
|
+
try {
|
|
13728
|
+
this.viewer.setFilterOptions({
|
|
13729
|
+
filters: { processors: [] }
|
|
13730
|
+
});
|
|
13731
|
+
if (this.viewer.world)
|
|
13732
|
+
this.viewer.world.draw();
|
|
13733
|
+
} catch (e) {
|
|
13734
|
+
console.warn("ColorAdjustPlugin destroy error:", e);
|
|
13735
|
+
}
|
|
13736
|
+
}
|
|
13737
|
+
}
|
|
13738
|
+
this.viewer = null;
|
|
13739
|
+
this._adjustments = null;
|
|
13740
|
+
}
|
|
13741
|
+
apply() {
|
|
13742
|
+
if (this.debounceTimer)
|
|
13743
|
+
window.clearTimeout(this.debounceTimer);
|
|
13744
|
+
this.debounceTimer = window.setTimeout(() => {
|
|
13745
|
+
if (!this.viewer.setFilterOptions)
|
|
13746
|
+
return;
|
|
13747
|
+
console.log(this.adjustments);
|
|
13748
|
+
this.viewer.setFilterOptions({
|
|
13749
|
+
filters: {
|
|
13750
|
+
processors: this.combinedProcessor
|
|
13751
|
+
},
|
|
13752
|
+
loadMode: this.loadMode,
|
|
13753
|
+
debounceMs: this.debounceMs
|
|
13754
|
+
});
|
|
13755
|
+
if (this.viewer.world)
|
|
13756
|
+
this.viewer.world.draw();
|
|
13757
|
+
}, 20);
|
|
13758
|
+
}
|
|
13759
|
+
setAdjustments(adj) {
|
|
13760
|
+
this._adjustments = { ...this._adjustments, ...adj };
|
|
13761
|
+
this.apply();
|
|
13762
|
+
}
|
|
13763
|
+
reset() {
|
|
13764
|
+
this._adjustments = {
|
|
13765
|
+
brightness: 1,
|
|
13766
|
+
contrast: 1,
|
|
13767
|
+
saturation: 1,
|
|
13768
|
+
gamma: 1,
|
|
13769
|
+
hue: 0,
|
|
13770
|
+
invert: false,
|
|
13771
|
+
sepia: false,
|
|
13772
|
+
greyscale: false
|
|
13773
|
+
};
|
|
13774
|
+
this.apply();
|
|
13775
|
+
}
|
|
13776
|
+
}
|
|
12810
13777
|
(() => {
|
|
12811
13778
|
(function(t) {
|
|
12812
13779
|
t.SelectionOverlay = function(s, c) {
|
|
@@ -13913,6 +14880,198 @@ class ScalebarPlugin {
|
|
|
13913
14880
|
this.scalebar = null;
|
|
13914
14881
|
}
|
|
13915
14882
|
}
|
|
14883
|
+
class MagnificationPlugin {
|
|
14884
|
+
constructor(viewer, options = {}) {
|
|
14885
|
+
__publicField(this, "viewer");
|
|
14886
|
+
__publicField(this, "options");
|
|
14887
|
+
__publicField(this, "magnificationElement", null);
|
|
14888
|
+
__publicField(this, "magnificationDisplay", null);
|
|
14889
|
+
// 修改 updateMagnificationDisplay 方法
|
|
14890
|
+
__publicField(this, "updateMagnificationDisplay", () => {
|
|
14891
|
+
var _a, _b;
|
|
14892
|
+
console.log("updateMagnificationDisplay", this.options);
|
|
14893
|
+
if (this.options.type === "LD") {
|
|
14894
|
+
const tiledImage = this.viewer.world.getItemAt(0);
|
|
14895
|
+
if (!this.magnificationDisplay || !tiledImage)
|
|
14896
|
+
return;
|
|
14897
|
+
const source = this.viewer.source;
|
|
14898
|
+
const width = source.width;
|
|
14899
|
+
source.height;
|
|
14900
|
+
const pixelsPerMeter = this.options.pixelsPerMeter || (((_a = this.viewer.scalebarInstance) == null ? void 0 : _a.pixelsPerMeter) || 96);
|
|
14901
|
+
const currentZoom = this.viewer.viewport.getZoom();
|
|
14902
|
+
const conversionFactor = 20 * 11e-4 * pixelsPerMeter / width;
|
|
14903
|
+
const magnification = conversionFactor * currentZoom;
|
|
14904
|
+
this.magnificationDisplay.innerHTML = `<span>${magnification.toFixed(2)}X</span>`;
|
|
14905
|
+
} else {
|
|
14906
|
+
const tiledImage = this.viewer.world.getItemAt(0);
|
|
14907
|
+
if (!this.magnificationDisplay || !tiledImage)
|
|
14908
|
+
return;
|
|
14909
|
+
const currentZoom = this.viewer.viewport.viewportToImageZoom(
|
|
14910
|
+
this.viewer.viewport.getZoom()
|
|
14911
|
+
);
|
|
14912
|
+
const baseMag = ((_b = this.viewer.source) == null ? void 0 : _b.max_magnification) || 40;
|
|
14913
|
+
console.log(currentZoom, baseMag);
|
|
14914
|
+
const magnification = currentZoom * baseMag;
|
|
14915
|
+
this.magnificationDisplay.innerHTML = `<span>${magnification.toFixed(2)}X</span>`;
|
|
14916
|
+
}
|
|
14917
|
+
});
|
|
14918
|
+
this.viewer = viewer;
|
|
14919
|
+
this.options = options;
|
|
14920
|
+
this.init();
|
|
14921
|
+
}
|
|
14922
|
+
init() {
|
|
14923
|
+
this.injectStyles();
|
|
14924
|
+
this.magnificationElement = document.createElement("div");
|
|
14925
|
+
this.magnificationElement.className = `med-magnification med-magnification--${this.options.position || "MIDDLE_LEFT"}`;
|
|
14926
|
+
this.magnificationDisplay = document.createElement("div");
|
|
14927
|
+
this.magnificationDisplay.className = "med-magnification-display";
|
|
14928
|
+
this.magnificationDisplay.innerHTML = `<span>-</span>`;
|
|
14929
|
+
this.magnificationElement.appendChild(this.magnificationDisplay);
|
|
14930
|
+
const buttonsContainer = document.createElement("div");
|
|
14931
|
+
buttonsContainer.className = "med-magnification-buttons";
|
|
14932
|
+
this.magnificationElement.appendChild(buttonsContainer);
|
|
14933
|
+
const magnifications = [40, 20, 10, 4];
|
|
14934
|
+
magnifications.forEach((mag) => {
|
|
14935
|
+
const btn = this.createButton(
|
|
14936
|
+
`${mag}X`,
|
|
14937
|
+
() => this.setMagnification(mag)
|
|
14938
|
+
);
|
|
14939
|
+
buttonsContainer.appendChild(btn);
|
|
14940
|
+
});
|
|
14941
|
+
const fitBtn = this.createButton("Fit", () => this.fitToScreen());
|
|
14942
|
+
buttonsContainer.appendChild(fitBtn);
|
|
14943
|
+
this.viewer.element.appendChild(this.magnificationElement);
|
|
14944
|
+
this.viewer.addHandler("animation", this.updateMagnificationDisplay);
|
|
14945
|
+
this.viewer.addHandler("animation-finish", this.updateMagnificationDisplay);
|
|
14946
|
+
this.viewer.addHandler("open", this.updateMagnificationDisplay);
|
|
14947
|
+
this.updateMagnificationDisplay();
|
|
14948
|
+
}
|
|
14949
|
+
createButton(text, onClick) {
|
|
14950
|
+
const button = document.createElement("button");
|
|
14951
|
+
button.className = "med-magnification-btn";
|
|
14952
|
+
button.textContent = text;
|
|
14953
|
+
button.onclick = onClick;
|
|
14954
|
+
return button;
|
|
14955
|
+
}
|
|
14956
|
+
// 修改 setMagnification 方法
|
|
14957
|
+
setMagnification(mag) {
|
|
14958
|
+
var _a, _b;
|
|
14959
|
+
if (this.options.type === "LD") {
|
|
14960
|
+
const tiledImage = this.viewer.world.getItemAt(0);
|
|
14961
|
+
if (!this.magnificationDisplay || !tiledImage)
|
|
14962
|
+
return;
|
|
14963
|
+
const source = this.viewer.source;
|
|
14964
|
+
const width = source.width;
|
|
14965
|
+
source.height;
|
|
14966
|
+
const pixelsPerMeter = this.options.pixelsPerMeter || (((_a = this.viewer.scalebarInstance) == null ? void 0 : _a.pixelsPerMeter) || 96);
|
|
14967
|
+
this.viewer.viewport.getZoom();
|
|
14968
|
+
const conversionFactor = 20 * 11e-4 * pixelsPerMeter / width;
|
|
14969
|
+
const targetZoom = mag / conversionFactor;
|
|
14970
|
+
this.viewer.viewport.zoomTo(targetZoom, this.viewer.viewport.getCenter(), false);
|
|
14971
|
+
this.updateMagnificationDisplay();
|
|
14972
|
+
} else {
|
|
14973
|
+
const tiledImage = this.viewer.world.getItemAt(0);
|
|
14974
|
+
if (!tiledImage)
|
|
14975
|
+
return;
|
|
14976
|
+
const baseMag = ((_b = this.viewer.source) == null ? void 0 : _b.max_magnification) || 40;
|
|
14977
|
+
const targetImageZoom = mag / baseMag;
|
|
14978
|
+
const targetViewportZoom = this.viewer.viewport.imageToViewportZoom(targetImageZoom);
|
|
14979
|
+
this.viewer.viewport.zoomTo(
|
|
14980
|
+
targetViewportZoom,
|
|
14981
|
+
this.viewer.viewport.getCenter(),
|
|
14982
|
+
false
|
|
14983
|
+
);
|
|
14984
|
+
}
|
|
14985
|
+
}
|
|
14986
|
+
fitToScreen() {
|
|
14987
|
+
this.viewer.viewport.fitVertically(true);
|
|
14988
|
+
this.viewer.viewport.fitHorizontally(true);
|
|
14989
|
+
this.viewer.viewport.goHome();
|
|
14990
|
+
}
|
|
14991
|
+
refresh() {
|
|
14992
|
+
this.updateMagnificationDisplay();
|
|
14993
|
+
}
|
|
14994
|
+
destroy() {
|
|
14995
|
+
if (this.magnificationElement) {
|
|
14996
|
+
this.magnificationElement.remove();
|
|
14997
|
+
this.magnificationElement = null;
|
|
14998
|
+
}
|
|
14999
|
+
if (this.magnificationDisplay) {
|
|
15000
|
+
this.magnificationDisplay = null;
|
|
15001
|
+
}
|
|
15002
|
+
this.viewer.removeHandler("animation", this.updateMagnificationDisplay);
|
|
15003
|
+
this.viewer.removeHandler(
|
|
15004
|
+
"animation-finish",
|
|
15005
|
+
this.updateMagnificationDisplay
|
|
15006
|
+
);
|
|
15007
|
+
this.viewer.removeHandler("open", this.updateMagnificationDisplay);
|
|
15008
|
+
this.viewer = null;
|
|
15009
|
+
}
|
|
15010
|
+
injectStyles() {
|
|
15011
|
+
const STYLE_ID2 = "med-magnification-styles";
|
|
15012
|
+
if (document.getElementById(STYLE_ID2))
|
|
15013
|
+
return;
|
|
15014
|
+
const style = document.createElement("style");
|
|
15015
|
+
style.id = STYLE_ID2;
|
|
15016
|
+
style.textContent = `
|
|
15017
|
+
.med-magnification {
|
|
15018
|
+
position: absolute;
|
|
15019
|
+
display: flex;
|
|
15020
|
+
flex-direction: column;
|
|
15021
|
+
gap: 8px;
|
|
15022
|
+
padding: 10px;
|
|
15023
|
+
z-index: 100;
|
|
15024
|
+
background: rgba(24, 28, 36, 0.85);
|
|
15025
|
+
border-radius: 12px;
|
|
15026
|
+
backdrop-filter: blur(10px);
|
|
15027
|
+
border: 1px solid rgba(255,255,255,0.1);
|
|
15028
|
+
box-shadow: 0 8px 32px rgba(0,0,0,0.3);
|
|
15029
|
+
}
|
|
15030
|
+
.med-magnification--TOP_LEFT { top: calc(18px + ${this.options.offsetY || 0}px); left: calc(18px + ${this.options.offsetX || 0}px); }
|
|
15031
|
+
.med-magnification--TOP_CENTER { top: calc(18px + ${this.options.offsetY || 0}px); left: 50%; transform: translateX(-50%) translateX(${this.options.offsetX || 0}px); }
|
|
15032
|
+
.med-magnification--TOP_RIGHT { top: calc(18px + ${this.options.offsetY || 0}px); right: calc(18px - ${this.options.offsetX || 0}px); }
|
|
15033
|
+
.med-magnification--BOTTOM_LEFT { bottom: calc(18px - ${this.options.offsetY || 0}px); left: calc(18px + ${this.options.offsetX || 0}px); }
|
|
15034
|
+
.med-magnification--BOTTOM_CENTER { bottom: calc(18px - ${this.options.offsetY || 0}px); left: 50%; transform: translateX(-50%) translateX(${this.options.offsetX || 0}px); }
|
|
15035
|
+
.med-magnification--BOTTOM_RIGHT { bottom: calc(18px - ${this.options.offsetY || 0}px); right: calc(18px - ${this.options.offsetX || 0}px); }
|
|
15036
|
+
.med-magnification--MIDDLE_LEFT { top: 50%; left: calc(18px + ${this.options.offsetX || 0}px); transform: translateY(-50%) translateY(${this.options.offsetY || 0}px); }
|
|
15037
|
+
.med-magnification--MIDDLE_RIGHT { top: 50%; right: calc(18px - ${this.options.offsetX || 0}px); transform: translateY(-50%) translateY(${this.options.offsetY || 0}px); }
|
|
15038
|
+
|
|
15039
|
+
.med-magnification-display {
|
|
15040
|
+
background: rgba(255,255,255,0.08);
|
|
15041
|
+
color: #f2f5f8;
|
|
15042
|
+
font-size: 14px;
|
|
15043
|
+
border: 1px dashed rgba(255,255,255,0.3);
|
|
15044
|
+
padding: 8px 0px;
|
|
15045
|
+
border-radius: 8px;
|
|
15046
|
+
text-align: center;
|
|
15047
|
+
font-weight: bold;
|
|
15048
|
+
min-width: 60px;
|
|
15049
|
+
}
|
|
15050
|
+
.med-magnification-buttons {
|
|
15051
|
+
display: flex;
|
|
15052
|
+
flex-direction: column;
|
|
15053
|
+
gap: 6px;
|
|
15054
|
+
}
|
|
15055
|
+
.med-magnification-btn {
|
|
15056
|
+
background: rgba(49, 208, 170, 0.15);
|
|
15057
|
+
color: #f2f5f8;
|
|
15058
|
+
border: none;
|
|
15059
|
+
padding: 8px 16px;
|
|
15060
|
+
border-radius: 8px;
|
|
15061
|
+
cursor: pointer;
|
|
15062
|
+
transition: all 0.2s cubic-bezier(0.4, 0, 0.2, 1);
|
|
15063
|
+
font-weight: bold;
|
|
15064
|
+
}
|
|
15065
|
+
.med-magnification-btn:hover {
|
|
15066
|
+
background: rgba(49, 208, 170, 0.3);
|
|
15067
|
+
}
|
|
15068
|
+
.med-magnification-btn:active {
|
|
15069
|
+
transform: scale(0.95);
|
|
15070
|
+
}
|
|
15071
|
+
`;
|
|
15072
|
+
document.head.appendChild(style);
|
|
15073
|
+
}
|
|
15074
|
+
}
|
|
13916
15075
|
class MedViewerEngine {
|
|
13917
15076
|
constructor(options) {
|
|
13918
15077
|
__publicField(this, "viewer");
|
|
@@ -13922,6 +15081,7 @@ class MedViewerEngine {
|
|
|
13922
15081
|
__publicField(this, "colorAdjust", null);
|
|
13923
15082
|
__publicField(this, "selection", null);
|
|
13924
15083
|
__publicField(this, "scalebar", null);
|
|
15084
|
+
__publicField(this, "magnification", null);
|
|
13925
15085
|
__publicField(this, "options");
|
|
13926
15086
|
const openseadragonOptions = {
|
|
13927
15087
|
id: "osd-container",
|
|
@@ -13974,7 +15134,7 @@ class MedViewerEngine {
|
|
|
13974
15134
|
rotationIncrement: 90,
|
|
13975
15135
|
// --- 性能 ---
|
|
13976
15136
|
maxTilesPerFrame: 3,
|
|
13977
|
-
maxImageCacheCount:
|
|
15137
|
+
maxImageCacheCount: 100,
|
|
13978
15138
|
// --- 手势 ---
|
|
13979
15139
|
gestureSettingsMouse: {
|
|
13980
15140
|
dragToPan: true,
|
|
@@ -14031,6 +15191,14 @@ class MedViewerEngine {
|
|
|
14031
15191
|
const scalebarConfig = typeof plugins.scalebar === "object" ? plugins.scalebar : {};
|
|
14032
15192
|
this.scalebar = new ScalebarPlugin(this.viewer, scalebarConfig);
|
|
14033
15193
|
}
|
|
15194
|
+
if (plugins.colorAdjust) {
|
|
15195
|
+
const config = typeof plugins.colorAdjust === "object" ? plugins.colorAdjust : {};
|
|
15196
|
+
this.colorAdjust = new ColorAdjustPlugin(this.viewer, config);
|
|
15197
|
+
}
|
|
15198
|
+
if (plugins.magnification) {
|
|
15199
|
+
const config = typeof plugins.magnification === "object" ? plugins.magnification : {};
|
|
15200
|
+
this.magnification = new MagnificationPlugin(this.viewer, config);
|
|
15201
|
+
}
|
|
14034
15202
|
}
|
|
14035
15203
|
/**
|
|
14036
15204
|
* 真正挂载 Annotorious 的私有方法
|
|
@@ -14075,12 +15243,15 @@ if (typeof window !== "undefined") {
|
|
|
14075
15243
|
MedViewerEngine,
|
|
14076
15244
|
AnnoAnnotator,
|
|
14077
15245
|
MedToolbar,
|
|
14078
|
-
SelectionPlugin
|
|
14079
|
-
|
|
15246
|
+
SelectionPlugin,
|
|
15247
|
+
ColorAdjustPlugin,
|
|
15248
|
+
MagnificationPlugin
|
|
14080
15249
|
};
|
|
14081
15250
|
}
|
|
14082
15251
|
export {
|
|
14083
15252
|
AnnoAnnotator,
|
|
15253
|
+
ColorAdjustPlugin,
|
|
15254
|
+
MagnificationPlugin,
|
|
14084
15255
|
MedToolbar,
|
|
14085
15256
|
MedViewerEngine,
|
|
14086
15257
|
SelectionPlugin
|