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.
@@ -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 = ["#ff0000", "#00ff00", "#0000ff", "#ffff00", "#00ffff", "#ffffff"];
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
- { id: "anno", icon: buttonAnno, dropdownContent: createAnnoDropdownContent, label: "标注设置" },
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
- const defaultButtonMap = new Map(DEFAULT_BUTTONS.map((btn) => [btn.id, btn]));
12592
- const mergedButtons = [];
12593
- if (this.options.buttons) {
12594
- this.options.buttons.forEach((userBtn) => {
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
- if (defaultBtn) {
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
- mergedButtons.push(...Array.from(defaultButtonMap.values()));
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(this.engine, () => this.closeDropdown());
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(() => document.addEventListener("click", this.outsideClickHandler), 0);
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("translateY(10px)", "translateY(-10px)");
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: 200,
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
- // ColorAdjustPlugin
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