/** * Auto-Enhance — one-click smart photo improvement. * Applies auto white balance, CLAHE contrast, saturation boost, and mild sharpening. * Strength slider lets the user dial in how strong the effect is. * * Menu target: image/auto_enhance.auto_enhance */ import app from './../../app.js'; import config from './../../config.js'; import Dialog_class from './../../libs/popup.js'; import alertify from './../../../../node_modules/alertifyjs/build/alertify.min.js'; var instance = null; class Image_auto_enhance_class { constructor() { if (instance) return instance; instance = this; this.Dialog = new Dialog_class(); this.isProcessing = false; } async auto_enhance() { if (!config.layer || config.layer.type !== 'image') { alertify.error('Select an image layer first.'); return; } var _this = this; this.Dialog.show({ title: 'Auto-Enhance', params: [ { title: '', html: `
Automatically improves white balance, contrast, saturation, and sharpness.
`, }, { name: 'strength', title: 'Strength:', value: '100', values: ['25', '50', '75', '100'], type: 'select', }, { name: 'new_layer', title: 'Keep original as separate layer:', value: false, }, ], on_finish: async function (params) { await _this._run(parseFloat(params.strength) / 100, params.new_layer); }, }); } async _run(strength, newLayer) { if (this.isProcessing) return; this.isProcessing = true; alertify.message('Enhancing…', 0); try { const layer = config.layer; const c = document.createElement('canvas'); c.width = layer.width_original; c.height = layer.height_original; c.getContext('2d').drawImage(layer.link, 0, 0); const imageB64 = c.toDataURL('image/png').split(',')[1]; const base = window.API_BASE_URL || ''; const r = await fetch(`${base}/api/enhance`, { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ image: imageB64, strength }), }); if (!r.ok) throw new Error((await r.json().catch(() => ({}))).detail || 'Failed'); const data = await r.json(); const img = new Image(); img.onload = () => { const rc = document.createElement('canvas'); rc.width = img.naturalWidth; rc.height = img.naturalHeight; rc.getContext('2d').drawImage(img, 0, 0); if (newLayer) { app.State.do_action( new app.Actions.Bundle_action('auto_enhance', 'Auto-Enhance', [ new app.Actions.Insert_layer_action({ name: layer.name + ' (Enhanced)', type: 'image', data: img.src, x: layer.x, y: layer.y, width: img.naturalWidth, height: img.naturalHeight, width_original: img.naturalWidth, height_original: img.naturalHeight, }) ]) ); } else { app.State.do_action( new app.Actions.Bundle_action('auto_enhance', 'Auto-Enhance', [ new app.Actions.Update_layer_image_action(rc) ]) ); } alertify.dismissAll(); alertify.success('Enhancement applied.'); this.isProcessing = false; }; img.onerror = () => { alertify.dismissAll(); alertify.error('Failed to load result.'); this.isProcessing = false; }; img.src = 'data:image/png;base64,' + data.result; } catch (err) { alertify.dismissAll(); alertify.error('Auto-enhance failed: ' + (err.message || err)); this.isProcessing = false; } } } export default Image_auto_enhance_class;