Skip to content

Commit 4c6b549

Browse files
committed
Add screenshot and thumbnail functionality to webx desktop. Allow for type and quality of screenshot to be specified.
1 parent 2720dd0 commit 4c6b549

File tree

6 files changed

+35
-19
lines changed

6 files changed

+35
-19
lines changed

package-lock.json

Lines changed: 4 additions & 4 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@
3838
"@ctrl/ngx-codemirror": "^7.0.0",
3939
"@illgrenoble/ngx-fs-client": "^1.2.0",
4040
"@illgrenoble/visa-print-client": "^1.1.3",
41-
"@illgrenoble/webx-client": "^1.0.0",
41+
"@illgrenoble/webx-client": "^1.1.0",
4242
"@ng-select/ng-select": "^10.0.4",
4343
"@ngrx/effects": "^15.4.0",
4444
"@ngrx/router-store": "^15.4.0",

src/app/user/instance/instance.component.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -266,9 +266,9 @@ export class InstanceComponent implements OnInit, OnDestroy {
266266
* Generate a screenshot of the remote desktop and download to the client
267267
*/
268268
private createScreenshot(): void {
269-
this.manager.createScreenshot().then((blob) => {
269+
this.manager.createScreenshot('image/jpeg', 0.9).then((blob) => {
270270
if (blob) {
271-
FileSaver.saveAs(blob, `screenshot.png`);
271+
FileSaver.saveAs(blob, `screenshot.jpg`);
272272
}
273273
});
274274
}

src/app/vdi/services/guacamole-virtual-desktop-manager.service.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -97,12 +97,12 @@ export class GuacamoleVirtualDesktopManager extends VirtualDesktopManager {
9797
/**
9898
* Generate a screenshot
9999
*/
100-
public createScreenshot(): Promise<Blob> {
100+
public createScreenshot(type: string, quality: number): Promise<Blob> {
101101
return new Promise((resolve, reject) => {
102102
const display = this.client.getDisplay();
103103
if (display && display.getWidth() > 0 && display.getHeight() > 0) {
104104
const canvas = display.flatten();
105-
return canvas.toBlob(resolve);
105+
return canvas.toBlob(resolve, type, quality);
106106
} else {
107107
reject();
108108
}

src/app/vdi/services/virtual-desktop-manager.service.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,8 +188,11 @@ export abstract class VirtualDesktopManager {
188188

189189
/**
190190
* Generate a screenshot
191+
*
192+
* @param type The image type (image/png, image/jpeg, etc.)
193+
* @param quality The image quality (0-1)
191194
*/
192-
public abstract createScreenshot(): Promise<Blob>;
195+
public abstract createScreenshot(type: string, quality: number): Promise<Blob>;
193196

194197
/**
195198
* Send text to the remote clipboard

src/app/vdi/services/webx-virtual-desktop-manager.service.ts

Lines changed: 22 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -73,25 +73,38 @@ export class WebXVirtualDesktopManager extends VirtualDesktopManager {
7373
this._client.disconnect();
7474
}
7575

76-
async createScreenshot(): Promise<Blob> {
77-
// todo
78-
console.log('createScreenshot not implemented for WebX Virtual Desktop Manager');
79-
return null;
76+
async createScreenshot(type: string, quality: number): Promise<Blob> {
77+
return this._client.createScreenshot(type, quality);
8078
}
8179

8280
async createThumbnail(width: number, height: number): Promise<Blob> {
83-
// todo
84-
console.log('createThumbnail not implemented for WebX Virtual Desktop Manager');
85-
return null;
81+
const screenshotBlob = await this.createScreenshot('image/png', 1.0);
82+
const img = new Image();
83+
const canvas = document.createElement('canvas');
84+
const ctx = canvas.getContext('2d');
85+
86+
canvas.width = width;
87+
canvas.height = height;
88+
89+
return new Promise((resolve, reject) => {
90+
const url = URL.createObjectURL(screenshotBlob);
91+
img.onload = () => {
92+
ctx.drawImage(img, 0, 0, width, height);
93+
canvas.toBlob(blob => {
94+
resolve(blob);
95+
URL.revokeObjectURL(url);
96+
}, 'image/jpeg', 0.8);
97+
};
98+
img.onerror = reject;
99+
img.src = url;
100+
});
86101
}
87102

88103
sendRemoteClipboardData(text: string): void {
89104
// todo
90105
throw new Error('sendRemoteClipboardData not implemented for WebX Virtual Desktop Manager');
91106
}
92107

93-
94-
95108
private _onConnected(): void {
96109
this.setState(VirtualDesktopManager.STATE.WAITING);
97110

0 commit comments

Comments
 (0)