Added version check for Adobe Photoshop in real-time img2img feature

master
Abdullah Alfaraj 2023-12-07 11:46:25 +03:00
parent 7e7479f554
commit 0ca6501456
3 changed files with 115 additions and 72 deletions

View File

@ -1821,64 +1821,3 @@ async function openFileFromUrlExe(url, format = 'gif') {
await openFileFromUrl(url, format) await openFileFromUrl(url, format)
}) })
} }
const imaging = require('photoshop').imaging
async function getImageFromLayer(sourceBounds, layer_id, components) {
const image_obj = await imaging.getPixels({
...(sourceBounds && {
sourceBounds: { left: 0, top: 0, right: 3000, bottom: 3000 },
}),
...(layer_id && { layerID: layer_id }),
components: components,
applyAlpha: true,
colorSpace: 'RGB',
})
return image_obj
}
async function imageObjectToBase64(imgObj) {
const pixelData = await imgObj.imageData.getData()
// const base64 = Buffer.from(pixelData).toString('base64')
// const base64 = _arrayBufferToBase64(pixelData)
const jpegData = await imaging.encodeImageData({
imageData: imgObj.imageData,
base64: true,
// pixelFormat: 'RGBA',
// applyAlpha: true,
})
return jpegData
// return base64
}
async function imageObjectToBase64Url(imgObj) {
const jpegData = await imageObjectToBase64(imgObj)
const dataUrl = 'data:image/jpeg;base64,' + jpegData
// const dataUrl = 'data:image/png;base64,' + jpegData
return dataUrl
}
async function getImageFromCanvas(layer_id) {
let data_url
await executeAsModal(async () => {
const selection_info = await psapi.getSelectionInfoExe()
// let imgObj = await getImageFromLayer({},app.activeDocument.activeLayers[0].id,3)
let imgObj = await getImageFromLayer(selection_info, layer_id, 3)
data_url = await imageObjectToBase64Url(imgObj)
// console.log('data_url:', data_url)
// html_manip.setInitImageSrc(data_url)
console.log('getImageFromCanvas: triggered')
})
return data_url
}
let g_canvas_data_url
function getImageFromCanvasByInterval(interval = 5000) {
const interval_id = setInterval(async () => {
console.log('setInterval trigger')
g_canvas_data_url = await getImageFromCanvas()
}, interval)
return interval_id
}

View File

@ -19,7 +19,7 @@ import { Grid } from '../util/grid'
import { io } from '../util/oldSystem' import { io } from '../util/oldSystem'
import { app, core } from 'photoshop' import { app, core } from 'photoshop'
import { reaction, toJS } from 'mobx' import { reaction, toJS } from 'mobx'
import { storage } from 'uxp' import { host, storage } from 'uxp'
import util, { import util, {
ComfyInputType, ComfyInputType,
@ -29,7 +29,14 @@ import util, {
store, store,
} from './util' } from './util'
import { base64UrlToBase64, copyJson, urlToCanvas } from '../util/ts/general' import {
base64UrlToBase64,
copyJson,
deleteKeys,
getImageFromCanvas_new,
isValidVersion,
urlToCanvas,
} from '../util/ts/general'
import comfyapi from './comfyapi' import comfyapi from './comfyapi'
import { getSelectionInfoExe } from '../../psapi' import { getSelectionInfoExe } from '../../psapi'
import { moveImageToLayer } from '../util/ts/io' import { moveImageToLayer } from '../util/ts/io'
@ -1516,11 +1523,11 @@ class ComfyWorkflowComponent extends React.Component<{}, { value?: number }> {
store.data.lastCall = now store.data.lastCall = now
const image_data_url = const image_data_url =
//@ts-ignore await getImageFromCanvas_new()
await getImageFromCanvas()
const image_base64 = const image_base64 =
base64UrlToBase64( base64UrlToBase64(
image_data_url image_data_url!
) )
const image_name = const image_name =
@ -1571,13 +1578,12 @@ class ComfyWorkflowComponent extends React.Component<{}, { value?: number }> {
node_id node_id
].data?.layer_id ].data?.layer_id
const layer_data_url = const layer_data_url =
//@ts-ignore await getImageFromCanvas_new(
await getImageFromCanvas( layer_id!
layer_id
) )
const layer_image_base64 = const layer_image_base64 =
base64UrlToBase64( base64UrlToBase64(
layer_data_url layer_data_url!
) )
const image_name = const image_name =
@ -1597,10 +1603,21 @@ class ComfyWorkflowComponent extends React.Component<{}, { value?: number }> {
} }
} catch (e) { } catch (e) {
console.error(e) console.error(e)
if (!isValidVersion(25)) {
// const errorMessage = `Real-time img2img Require Adobe Photoshop version 25 or higher. Your current version is ${host.version}. Please update Adobe Photoshop to use this feature. You can still use realtime txt2img.`
// app.showAlert(errorMessage)
throw e
}
} }
} }
} catch (e) { } catch (e) {
console.error(e) console.error(e)
if (!isValidVersion(25)) {
const errorMessage = `Real-time img2img Require Adobe Photoshop version 25 or higher. Your current version is ${host.version}. Please update Adobe Photoshop to use this feature. You can still use realtime txt2img.`
app.showAlert(errorMessage)
throw errorMessage
}
throw e
} }
} }
while (store.data.infinite_loop) { while (store.data.infinite_loop) {

View File

@ -1,5 +1,6 @@
import { core } from 'photoshop' import { app, core, imaging } from 'photoshop'
import { io } from '../oldSystem' import { io, psapi } from '../oldSystem'
import { host } from 'uxp'
export function autoResize(textarea: any, text_content: string, delay = 300) { export function autoResize(textarea: any, text_content: string, delay = 300) {
try { try {
@ -68,3 +69,89 @@ export function newOutputImageName(format = 'png') {
console.log('generated image name:', image_name) console.log('generated image name:', image_name)
return image_name return image_name
} }
export function isValidVersion(minMajorVersion: number) {
const current_major_version = host.version.split('.')[0]
if (parseInt(current_major_version) >= minMajorVersion) {
return true
} else {
return false
}
}
async function getImageFromLayer(
sourceBounds: any,
layer_id: number | undefined,
components: any
) {
const image_obj = await imaging.getPixels({
...(sourceBounds && {
sourceBounds: {
left: sourceBounds.left,
top: sourceBounds.top,
right: sourceBounds.right,
bottom: sourceBounds.bottom,
},
}),
...(layer_id && { layerID: layer_id }),
components: components,
applyAlpha: true,
colorSpace: 'RGB',
})
return image_obj
}
async function imageObjectToBase64(imgObj: any) {
const pixelData = await imgObj.imageData.getData()
// const base64 = Buffer.from(pixelData).toString('base64')
// const base64 = _arrayBufferToBase64(pixelData)
const jpegData = await imaging.encodeImageData({
imageData: imgObj.imageData,
base64: true,
// pixelFormat: 'RGBA',
// applyAlpha: true,
})
return jpegData
// return base64
}
async function imageObjectToBase64Url(imgObj: any) {
const jpegData = await imageObjectToBase64(imgObj)
const dataUrl = 'data:image/jpeg;base64,' + jpegData
// const dataUrl = 'data:image/png;base64,' + jpegData
return dataUrl
}
export async function getImageFromCanvas_new(layer_id?: number) {
let data_url
if (!isValidVersion(25)) {
const errorMessage = `Real-time img2img Require Adobe Photoshop version 25 or higher. Your current version is ${host.version}. Please update Adobe Photoshop to use this feature. You can still use realtime txt2img.`
// app.showAlert(errorMessage)
throw errorMessage
}
await core.executeAsModal(
async () => {
const selection_info = await psapi.getSelectionInfoExe()
// let imgObj = await getImageFromLayer({},app.activeDocument.activeLayers[0].id,3)
let imgObj = await getImageFromLayer(selection_info, layer_id, 3)
data_url = await imageObjectToBase64Url(imgObj)
// console.log('data_url:', data_url)
// html_manip.setInitImageSrc(data_url)
console.log('getImageFromCanvas: triggered')
},
{ commandName: 'Get Image from Canvas' }
)
return data_url
}
export function deleteKeys(obj: Record<string, any>, keys: string[]) {
keys.forEach((key) => {
if (obj.hasOwnProperty(key)) {
delete obj[key]
}
})
return obj
}