From 25cfed0cc4fbaca80fc050cb8878fc1efd8b1841 Mon Sep 17 00:00:00 2001 From: "Alexander G. Morano" Date: Sun, 13 Jul 2025 14:16:39 -0400 Subject: [PATCH] * allow numpy>=1.25.0 --- README.md | 3 +++ core/compose.py | 55 +++++++++++++++++++++----------------------- pyproject.toml | 4 ++-- requirements.txt | 2 +- res/img/color-h.png | Bin 0 -> 8083 bytes 5 files changed, 32 insertions(+), 32 deletions(-) create mode 100644 res/img/color-h.png diff --git a/README.md b/README.md index 58583b6..4bbd73c 100644 --- a/README.md +++ b/README.md @@ -138,6 +138,9 @@ Nodes that have been migrated: [Migrated to Jovi_GLSL](https://github.com/Amorano/Jovi_GLSL) +**2025/07/13** @2.1.18: +* allow numpy>=1.25.0 + **2025/07/07** @2.1.17: * updated to cozy_comfyui 0.0.39 diff --git a/core/compose.py b/core/compose.py index 82bd1c8..520cb38 100644 --- a/core/compose.py +++ b/core/compose.py @@ -37,9 +37,6 @@ from cozy_comfyui.image.convert import \ from cozy_comfyui.image.misc import \ image_by_size, image_minmax, image_stack -from cozy_comfyui.image.pixel import \ - pixel_eval - # ============================================================================== # === GLOBAL === # ============================================================================== @@ -90,8 +87,8 @@ Combine two input images using various blending modes, such as normal, screen, m return Lexicon._parse(d) def run(self, **kw) -> RGBAMaskType: - pA = parse_param(kw, Lexicon.IMAGE_BACK, EnumConvertType.IMAGE, None) - pB = parse_param(kw, Lexicon.IMAGE_FORE, EnumConvertType.IMAGE, None) + back = parse_param(kw, Lexicon.IMAGE_BACK, EnumConvertType.IMAGE, None) + fore = parse_param(kw, Lexicon.IMAGE_FORE, EnumConvertType.IMAGE, None) mask = parse_param(kw, Lexicon.MASK, EnumConvertType.MASK, None) func = parse_param(kw, Lexicon.FUNCTION, EnumBlendType, EnumBlendType.NORMAL.name) alpha = parse_param(kw, Lexicon.ALPHA, EnumConvertType.FLOAT, 1) @@ -102,41 +99,41 @@ Combine two input images using various blending modes, such as normal, screen, m sample = parse_param(kw, Lexicon.SAMPLE, EnumInterpolation, EnumInterpolation.LANCZOS4.name) matte = parse_param(kw, Lexicon.MATTE, EnumConvertType.VEC4INT, (0, 0, 0, 255), 0, 255) inputMode = parse_param(kw, Lexicon.INPUT, EnumScaleInputMode, EnumScaleInputMode.NONE.name) - params = list(zip_longest_fill(pA, pB, mask, func, alpha, swap, invert, mode, wihi, sample, matte, inputMode)) + params = list(zip_longest_fill(back, fore, mask, func, alpha, swap, invert, mode, wihi, sample, matte, inputMode)) images = [] pbar = ProgressBar(len(params)) - for idx, (pA, pB, mask, func, alpha, swap, invert, mode, wihi, sample, matte, inputMode) in enumerate(params): + for idx, (back, fore, mask, func, alpha, swap, invert, mode, wihi, sample, matte, inputMode) in enumerate(params): if swap: - pA, pB = pB, pA + back, fore = fore, back width, height = IMAGE_SIZE_MIN, IMAGE_SIZE_MIN - if pA is None: - if pB is None: + if back is None: + if fore is None: if mask is None: if mode != EnumScaleMode.MATTE: width, height = wihi else: height, width = mask.shape[:2] else: - height, width = pB.shape[:2] + height, width = fore.shape[:2] else: - height, width = pA.shape[:2] + height, width = back.shape[:2] - if pA is None: - pA = channel_solid(width, height, matte) + if back is None: + back = channel_solid(width, height, matte) else: - pA = tensor_to_cv(pA) - matted = pixel_eval(matte) - pA = image_matte(pA, matted) + back = tensor_to_cv(back) + #matted = pixel_eval(matte) + #back = image_matte(back, matted) - if pB is None: + if fore is None: clear = list(matte[:3]) + [0] - pB = channel_solid(width, height, clear) + fore = channel_solid(width, height, clear) else: - pB = tensor_to_cv(pB) + fore = tensor_to_cv(fore) if mask is None: - mask = image_mask(pB, 255) + mask = image_mask(fore, 255) else: mask = tensor_to_cv(mask, 1) @@ -144,18 +141,18 @@ Combine two input images using various blending modes, such as normal, screen, m mask = 255 - mask if inputMode != EnumScaleInputMode.NONE: - # get the min/max of pA, pB; and mask? - imgs = [pA, pB] + # get the min/max of back, fore; and mask? + imgs = [back, fore] _, w, h = image_by_size(imgs) - pA = image_scalefit(pA, w, h, inputMode, sample, matte) - pB = image_scalefit(pB, w, h, inputMode, sample, matte) + back = image_scalefit(back, w, h, inputMode, sample, matte) + fore = image_scalefit(fore, w, h, inputMode, sample, matte) mask = image_scalefit(mask, w, h, inputMode, sample) - pA = image_scalefit(pA, w, h, EnumScaleMode.RESIZE_MATTE, sample, matte) - pB = image_scalefit(pB, w, h, EnumScaleMode.RESIZE_MATTE, sample, (0,0,0,255)) + back = image_scalefit(back, w, h, EnumScaleMode.RESIZE_MATTE, sample, matte) + fore = image_scalefit(fore, w, h, EnumScaleMode.RESIZE_MATTE, sample, (0,0,0,255)) mask = image_scalefit(mask, w, h, EnumScaleMode.RESIZE_MATTE, sample, (255,255,255,255)) - img = image_blend(pA, pB, mask, func, alpha) + img = image_blend(back, fore, mask, func, alpha) mask = image_mask(img) if mode != EnumScaleMode.MATTE: @@ -163,7 +160,7 @@ Combine two input images using various blending modes, such as normal, screen, m img = image_scalefit(img, width, height, mode, sample, matte) img = cv_to_tensor_full(img, matte) - #img = [cv_to_tensor(pA), cv_to_tensor(pB), cv_to_tensor(mask, True)] + #img = [cv_to_tensor(back), cv_to_tensor(fore), cv_to_tensor(mask, True)] images.append(img) pbar.update_absolute(idx) diff --git a/pyproject.toml b/pyproject.toml index 134a51b..9b14e25 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -1,7 +1,7 @@ [project] name = "jovimetrix" description = "Animation via tick. Parameter manipulation with wave generator. Unary and Binary math support. Value convert int/float/bool, VectorN and Image, Mask types. Shape mask generator. Stack images, do channel ops, split, merge and randomize arrays and batches. Load images & video from anywhere. Dynamic bus routing. Save output anywhere! Flatten, crop, transform; check colorblindness or linear interpolate values." -version = "2.1.17" +version = "2.1.18" license = { file = "LICENSE" } readme = "README.md" authors = [{ name = "Alexander G. Morano", email = "amorano@gmail.com" }] @@ -20,7 +20,7 @@ dependencies = [ "aenum", "git+https://github.com/cozy-comfyui/cozy_comfyui@main#egg=cozy_comfyui", "matplotlib", - "numpy<2", + "numpy>=1.25.0", "opencv-contrib-python", "Pillow" ] diff --git a/requirements.txt b/requirements.txt index 7aa3907..c5c1127 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,6 +1,6 @@ aenum git+https://github.com/cozy-comfyui/cozy_comfyui@main#egg=cozy_comfyui matplotlib -numpy<2 +numpy>=1.25.0 opencv-contrib-python Pillow \ No newline at end of file diff --git a/res/img/color-h.png b/res/img/color-h.png new file mode 100644 index 0000000000000000000000000000000000000000..d12d7d4b75df0199b7c3ba1c08df9754958d25e3 GIT binary patch literal 8083 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 PHupH-wg2|-0?z(7V8}e> literal 0 HcmV?d00001