PMA.UI Examples 2.43.3by Pathomation

Runtime controlling

advancedimage adjustmentsslide loader
Console
PMA.UI version: 2.43.3
Viewer example showing runtime controlling, such as flipping, changing brightness, gamma & contrast.
runtime_controls.html
1<!doctype html>
2<html lang="en">
3
4<head>
5    <meta charset="utf-8">
6    <meta http-equiv="X-UA-Compatible" content="IE=10">
7    <meta name="viewport" content="initial-scale=1.0, user-scalable=no, width=device-width">
8
9    <!-- Include PMA.UI required libraries downloaded or from CDN -->
10    <script src="./pma.ui/jquery-3.1.0.js"></script>
11    <link href="./pma.ui/font-awesome.min.css" type="text/css" rel="stylesheet">
12
13    <!-- Include optional libraries downloaded or from CDN -->
14    <link rel="stylesheet" href="./pma.ui/bootstrap.min.css">
15    <script src="./pma.ui/bootstrap.bundle.min.js"></script>
16
17    <!-- Include PMA.UI script & css -->
18    <script src="./pma.ui/pma.ui.js"></script>
19    <link href="./pma.ui/pma.ui.css" type="text/css" rel="stylesheet">
20
21    <!-- Include custom script & css -->
22    <script src="./js/runtime_controls.js"></script>
23    <link href="./css/runtime_controls.css" type="text/css" rel="stylesheet">
24
25    <title>Runtime controlling</title>
26</head>
27
28<body>
29    <div class="container-fluid">
30        <div class="row">
31            <div class="col-4 py-1 border-right">
32                <form>
33                    <fieldset id="controls" disabled>
34                        <div class="form-group row">
35                            <label for="inputBrightness" class="col-4 col-form-label col-form-label-sm">Brightness</label>
36                            <div class="col-6 pt-2">
37                                <input type="range" class="custom-range" min="-256" max="256" step="1" id="inputBrightness" value="">
38                            </div>
39                            <label for="inputBrightness" id="inputBrightness-label" class="col-2 col-form-label col-form-label-sm"></label>
40                        </div>
41                        <hr />
42                        <div class="form-group row">
43                            <label for="inputColorBalance" class="col-4 col-form-label col-form-label-sm align-self-center">Color balance</label>
44                            <div class="col-8 pt-2">
45                                <div class="form-group row">
46                                    <label for="inputBrightness" class="col-2 col-form-label col-form-label-sm">Red</label>
47                                    <div class="col-7 pt-2">
48                                        <input type="range" class="custom-range" min="0" max="2" step="0.01" id="inputColorBalanceR" value="">
49                                    </div>
50                                    <label for="inputColorBalanceR" id="inputColorBalanceR-label" class="col-3 col-form-label col-form-label-sm"></label>
51                                </div>
52                                <div class="form-group row">
53                                    <label for="inputBrightness" class="col-2 col-form-label col-form-label-sm">Green</label>
54                                    <div class="col-7 pt-2">
55                                        <input type="range" class="custom-range" min="0" max="2" step="0.01" id="inputColorBalanceG" value="">
56                                    </div>
57                                    <label for="inputColorBalanceG" id="inputColorBalanceG-label" class="col-3 col-form-label col-form-label-sm"></label>
58                                </div>
59                                <div class="form-group row">
60                                    <label for="inputBrightness" class="col-2 col-form-label col-form-label-sm">Blue</label>
61                                    <div class="col-7 pt-2">
62                                        <input type="range" class="custom-range" min="0" max="2" step="0.01" id="inputColorBalanceB" value="">
63                                    </div>
64                                    <label for="inputColorBalanceB" id="inputColorBalanceB-label" class="col-3 col-form-label col-form-label-sm"></label>
65                                </div>
66                            </div>
67                        </div>
68                        <hr />
69                        <div class="form-group row">
70                            <label for="inputContrast" class="col-4 col-form-label col-form-label-sm">Contrast</label>
71                            <div class="col-6 pt-2">
72                                <input type="range" class="custom-range" min="-20" max="20" step="0.1" id="inputContrast" value="">
73                            </div>
74                            <label for="inputContrast" id="inputContrast-label" class="col-2 col-form-label col-form-label-sm"></label>
75                        </div>
76                        <hr />
77                        <div class="form-group row">
78                            <label for="inputGamma" class="col-4 col-form-label col-form-label-sm">Gamma</label>
79                            <div class="col-6 pt-2">
80                                <input type="range" class="custom-range" min="0" max="50" step="0.1" id="inputGamma" value="">
81                            </div>
82                            <label for="inputGamma" id="inputGamma-label" class="col-2 col-form-label col-form-label-sm"></label>
83                        </div>
84                        <hr />
85                        <div class="form-group row">
86                            <div class="col text-center">
87                                <button id="auto-adjust-btn" type="button" class="btn btn-light btn-sm"><i class="fas fa-balance-scale"></i> Auto adjust colors</button>
88                                <button id="clear-auto-adjust-btn" type="button" class="btn btn-light btn-sm"><i class="fas fa-broom"></i> Clear color adjustments</button>
89                            </div>
90                        </div>
91                        <hr />
92                        <div class="form-group row">
93                            <div class="col">
94                                <button id="reset-btn" type="button" class="btn btn-light btn-sm"><i class="fas fa-history"></i> Reset values</button>
95                            </div>
96                        </div>
97                    </fieldset>
98                </form>
99            </div>
100            <div class="col-8">
101                <!-- The element that will host the viewport -->
102                <div id="viewer"></div>
103            </div>
104        </div>
105    </div>
106</body>
107
108</html>
runtime_controls.css
1html,
2body {
3    height: 100%;
4    padding: 0px;
5    margin: 0px;
6}
7
8#viewer {
9    height: 100vh;
10}
runtime_controls.js
1// Initial declarations
2var serverUrl = "https://host.pathomation.com/pma.core.2/";
3var serverUsername = "PMA_UI_demo";
4var serverPassword = "PMA_UI_demo";
5var caller = "DemoPortal";
6var slideLoaderElementSelector = "#viewer";
7var imagePath = "Reference/Ventana/OS-1.bif";
8var slideLoader = null;
9var brightness = 0;
10var contrast = 0;
11var gamma = 0;
12var red = 0;
13var green = 0;
14var blue = 0;
15
16jQuery(function () {
17    console.log(`PMA.UI version: ${PMA.UI.getVersion()}`);
18
19    // Create a context
20    var context = new PMA.UI.Components.Context({ caller: caller });
21
22    // Add an autologin authentication provider
23    new PMA.UI.Authentication.AutoLogin(context, [{ serverUrl: serverUrl, username: serverUsername, password: serverPassword }]);
24
25    // Create an image loader that will allow us to load images easily
26    slideLoader = new PMA.UI.Components.SlideLoader(context, {
27        element: slideLoaderElementSelector,
28    });
29
30    // Listen for the slide loaded event by the slide loader
31    slideLoader.listen(PMA.UI.Components.Events.SlideLoaded, function (args) {
32        console.log("Slide loaded");
33        console.log(args);
34
35        $("#reset-btn").attr("disabled", false);
36        $("#controls").attr("disabled", false);
37
38        // Get initial values from viewport
39        updateFromViewport();
40    });
41
42    // Listen for the slide info error event by slide loader
43    slideLoader.listen(PMA.UI.Components.Events.SlideInfoError, function (args) {
44        console.log("Slide info error");
45        console.log(args);
46    });
47
48    // Load the image with the context
49    slideLoader.load(serverUrl, imagePath);
50
51    $("#inputBrightness").on("input", function (e) {
52        $("#inputBrightness-label").text(e.target.value);
53    });
54
55    $("#inputBrightness").on("change", function (e) {
56        // Assign input's value to brightness
57        slideLoader.mainViewport.setBrightness(parseInt(e.target.value));
58        $("#inputBrightness-label").text(e.target.value);
59        console.log(`Brightness: ${e.target.value}`);
60    });
61
62    $("#inputContrast").on("input", function (e) {
63        $("#inputContrast-label").text(e.target.value);
64    });
65
66    $("#inputContrast").on("change", function (e) {
67        // Assign input's value to contrast
68        slideLoader.mainViewport.setContrast(parseFloat(e.target.value));
69        $("#inputContrast-label").text(e.target.value);
70        console.log(`Contrast: ${e.target.value}`);
71    });
72
73    $("#inputGamma").on("input", function (e) {
74        $("#inputGamma-label").text(e.target.value);
75    });
76
77    $("#inputGamma").on("change", function (e) {
78        // Assign input's value to gamma
79        slideLoader.mainViewport.setGamma(parseFloat(e.target.value));
80        $("#inputGamma-label").text(e.target.value);
81        console.log(`Gamma: ${e.target.value}`);
82    });
83
84    $("#inputColorBalanceR").on("input", function (e) {
85        $("#inputColorBalanceR-label").text(e.target.value);
86    });
87
88    $("#inputColorBalanceR").on("change", function (e) {
89        // Assign input's value to red
90        var r = parseFloat($("#inputColorBalanceR").val());
91        var g = parseFloat($("#inputColorBalanceG").val());
92        var b = parseFloat($("#inputColorBalanceB").val());
93        slideLoader.mainViewport.setColorBalance(r, g, b);
94
95        $("#inputColorBalanceR-label").text(e.target.value);
96        console.log(`Color Balance Red: ${e.target.value}`);
97    });
98
99    $("#inputColorBalanceG").on("input", function (e) {
100        $("#inputColorBalanceG-label").text(e.target.value);
101    });
102
103    $("#inputColorBalanceG").on("change", function (e) {
104        // Assign input's value to green
105        var r = parseFloat($("#inputColorBalanceR").val());
106        var g = parseFloat($("#inputColorBalanceG").val());
107        var b = parseFloat($("#inputColorBalanceB").val());
108        slideLoader.mainViewport.setColorBalance(r, g, b);
109
110        $("#inputColorBalanceG-label").text(e.target.value);
111        console.log(`Color Balance Green: ${e.target.value}`);
112    });
113
114    $("#inputColorBalanceB").on("input", function (e) {
115        $("#inputColorBalanceB-label").text(e.target.value);
116    });
117
118    $("#inputColorBalanceB").on("change", function (e) {
119        // Assign input's value to blue
120        var r = parseFloat($("#inputColorBalanceR").val());
121        var g = parseFloat($("#inputColorBalanceG").val());
122        var b = parseFloat($("#inputColorBalanceB").val());
123        slideLoader.mainViewport.setColorBalance(r, g, b);
124
125        $("#inputColorBalanceB-label").text(e.target.value);
126        console.log(`Color Balance Blue: ${e.target.value}`);
127    });
128
129    $("#auto-adjust-btn").on("click", function () {
130        slideLoader.mainViewport.autoAdjustColors(updateFromViewport);
131    });
132
133    $("#clear-auto-adjust-btn").on("click", function () {
134        contrast = 1;
135        gamma = 1;
136        red = 1;
137        green = 1;
138        blue = 1;
139        brightness = 0;
140        resetSettings();
141    });
142
143    $("#reset-btn").on("click", resetSettings);
144});
145
146function resetSettings() {
147    // Assign initial values to inputs
148    $("#inputBrightness").val(brightness);
149    $("#inputContrast").val(contrast);
150    $("#inputGamma").val(gamma);
151    $("#inputColorBalanceR").val(red);
152    $("#inputColorBalanceG").val(green);
153    $("#inputColorBalanceB").val(blue);
154    $("#inputBrightness-label").text(brightness);
155    $("#inputContrast-label").text(contrast);
156    $("#inputGamma-label").text(gamma);
157    $("#inputColorBalanceR-label").text(red);
158    $("#inputColorBalanceG-label").text(green);
159    $("#inputColorBalanceB-label").text(blue);
160
161    // Assign initial values to viewport
162    slideLoader.mainViewport.setBrightness(brightness);
163    slideLoader.mainViewport.setContrast(contrast);
164    slideLoader.mainViewport.setGamma(gamma);
165    slideLoader.mainViewport.setColorBalance(red, green, blue);
166
167    console.log("Values reverted to initial");
168}
169
170function updateFromViewport() {
171    brightness = slideLoader.mainViewport.getBrightness();
172    contrast = slideLoader.mainViewport.getContrast();
173    gamma = slideLoader.mainViewport.getGamma();
174    red = slideLoader.mainViewport.getColorBalance()[0];
175    green = slideLoader.mainViewport.getColorBalance()[1];
176    blue = slideLoader.mainViewport.getColorBalance()[2];
177
178    // Assign initial values to inputs
179    $("#inputBrightness").val(brightness);
180    $("#inputContrast").val(contrast);
181    $("#inputGamma").val(gamma);
182    $("#inputColorBalanceR").val(red);
183    $("#inputColorBalanceG").val(green);
184    $("#inputColorBalanceB").val(blue);
185    $("#inputBrightness-label").text(Math.round(brightness));
186    $("#inputContrast-label").text(Math.round(contrast));
187    $("#inputGamma-label").text(gamma);
188    $("#inputColorBalanceR-label").text(red);
189    $("#inputColorBalanceG-label").text(green);
190    $("#inputColorBalanceB-label").text(blue);
191}
192