Compare commits
4 Commits
Author | SHA1 | Date |
---|---|---|
|
a7d9ccf0da | |
|
80eb0edaec | |
|
0a29707c3c | |
|
bbace1896a |
56
README.md
56
README.md
|
@ -1,3 +1,57 @@
|
|||
# Image Editor Plus
|
||||
|
||||
Image Editor Plus is an add-on that lets you modify your image in seconds. Clear, fill, flip, rotation, adjusting colors, and applying some filters in just a few clicks without external editors such as PhotoShop or Gimp.
|
||||

|
||||
|
||||
Image Editor Plus is a Blender add-on that lets you modify your image in seconds. Clear, fill, flip, rotation, adjusting colors, and applying some filters in just a few clicks without external editors such as PhotoShop or Gimp.
|
||||
|
||||
This add-on extends the UV/Image Editor in Blender and provides the following operations.
|
||||
|
||||
- Cut/Copy/Paste
|
||||
- Clear, Fill
|
||||
- Crop
|
||||
- Adjust hue/saturation
|
||||
- Adjust brightness/contrast
|
||||
- Adjust gamma
|
||||
- Adjust color curve
|
||||
- Replace color
|
||||
- Flip, Rotate
|
||||
- Canvas size
|
||||
- Offset
|
||||
- Apply filters
|
||||
|
||||
NOTE: Currently, text editing is provided as a separate add-on: [Image Editor+ Text Tool](https://superhivemarket.com/products/imedp-text-tool)
|
||||
|
||||
These image operations can be applied to packed/unpacked images, and reflected to the 3D model view immediately.
|
||||
|
||||
You can make a selection to edit the desired area on your image (currently only rectangle selection supported).
|
||||
|
||||

|
||||
|
||||
It's easy to copy/paste a selection or an entire image. The pasted images are displayed as layers, and they can be moved, rotated or scaled.
|
||||
|
||||
NOTE: To display pasted layers in the 3D View, you need to use a [Image Layers Node](https://superhivemarket.com/products/image-layers-node) instead of built-in Texture Node.
|
||||
|
||||

|
||||
|
||||
## Filters
|
||||
|
||||
By applying the some filters, you can add special effects to your images.
|
||||
|
||||
- Blur
|
||||
- Sharpen
|
||||
- Add noise
|
||||
- Pixelize (Mosaic)
|
||||
- Make seamless
|
||||
- Normal map
|
||||
|
||||
"Make seamless" filter is useful for making your image tileable.
|
||||
|
||||

|
||||
|
||||
## Normal Map Generator
|
||||
|
||||
Normal Map is a texture where every pixel represents a normal vector and is used to add bumps to a surface.
|
||||
|
||||
This add-on uses a height map (black: low, white: high) as input and can convert it to a normal map.
|
||||
|
||||

|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
'''
|
||||
Copyright (C) 2021 - 2024 Akaneyu
|
||||
Copyright (C) 2021 - 2025 Akaneyu
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -18,7 +18,7 @@
|
|||
bl_info = {
|
||||
"name": "Image Editor Plus",
|
||||
"author": "akaneyu",
|
||||
"version": (1, 9, 0),
|
||||
"version": (1, 10, 0),
|
||||
"blender": (3, 3, 0),
|
||||
"location": "Image",
|
||||
"warning": "",
|
||||
|
|
19
addon/app.py
19
addon/app.py
|
@ -1,5 +1,5 @@
|
|||
'''
|
||||
Copyright (C) 2021 - 2024 Akaneyu
|
||||
Copyright (C) 2021 - 2025 Akaneyu
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -136,17 +136,18 @@ def draw_handler():
|
|||
|
||||
# release the selection if the image is changed
|
||||
if area_session.selection or area_session.selection_region:
|
||||
if img != area_session.prev_image:
|
||||
cancel_selection(context)
|
||||
if area_session.prev_image:
|
||||
if img != area_session.prev_image:
|
||||
cancel_selection(context)
|
||||
|
||||
elif width != area_session.prev_image_width \
|
||||
or height != area_session.prev_image_height:
|
||||
elif width != area_session.prev_image_width \
|
||||
or height != area_session.prev_image_height:
|
||||
|
||||
crop_selection(context)
|
||||
crop_selection(context)
|
||||
|
||||
area_session.prev_image = img
|
||||
area_session.prev_image_width = width
|
||||
area_session.prev_image_height = height
|
||||
area_session.prev_image = img
|
||||
area_session.prev_image_width = width
|
||||
area_session.prev_image_height = height
|
||||
|
||||
if area_session.layer_moving \
|
||||
or area_session.layer_rotating \
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
'''
|
||||
Copyright (C) 2021 - 2024 Akaneyu
|
||||
Copyright (C) 2021 - 2025 Akaneyu
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
|
@ -26,7 +26,9 @@ class IMAGE_EDITOR_PLUS_OT_make_selection(bpy.types.Operator):
|
|||
bl_idname = "image_editor_plus.make_selection"
|
||||
bl_label = "Make Selection"
|
||||
|
||||
def __init__(self):
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
self.lmb = False
|
||||
|
||||
def modal(self, context, event):
|
||||
|
@ -43,12 +45,14 @@ class IMAGE_EDITOR_PLUS_OT_make_selection(bpy.types.Operator):
|
|||
|
||||
if area_session.selection_region:
|
||||
area_session.selection_region[1] = region_pos
|
||||
else:
|
||||
area_session.selection_region = [region_pos, region_pos]
|
||||
|
||||
elif event.type == 'LEFTMOUSE':
|
||||
if event.value == 'PRESS':
|
||||
self.lmb = True
|
||||
|
||||
region_pos = [event.mouse_region_x, event.mouse_region_y]
|
||||
area_session.selection_region = [region_pos, region_pos]
|
||||
|
||||
elif event.value == 'RELEASE':
|
||||
self.lmb = False
|
||||
|
||||
|
@ -397,7 +401,9 @@ class IMAGE_EDITOR_PLUS_OT_move_layer(bpy.types.Operator):
|
|||
bl_idname = "image_editor_plus.move_layer"
|
||||
bl_label = "Move Layer"
|
||||
|
||||
def __init__(self):
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
self.start_input_position = [0, 0]
|
||||
self.start_layer_location = [0, 0]
|
||||
|
||||
|
@ -885,7 +891,9 @@ class IMAGE_EDITOR_PLUS_OT_rotate_layer_arbitrary(bpy.types.Operator):
|
|||
bl_idname = "image_editor_plus.rotate_layer_arbitrary"
|
||||
bl_label = "Rotate Layer Arbitrary"
|
||||
|
||||
def __init__(self):
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
self.start_input_position = [0, 0]
|
||||
self.start_layer_angle = 0
|
||||
|
||||
|
@ -967,7 +975,9 @@ class IMAGE_EDITOR_PLUS_OT_scale_layer(bpy.types.Operator):
|
|||
bl_idname = "image_editor_plus.scale_layer"
|
||||
bl_label = "Scale Layer"
|
||||
|
||||
def __init__(self):
|
||||
def __init__(self, *args, **kwargs):
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
self.start_input_position = [0, 0]
|
||||
self.start_layer_scale_x = 1.0
|
||||
self.start_layer_scale_y = 1.0
|
||||
|
|
Binary file not shown.
After Width: | Height: | Size: 584 KiB |
Binary file not shown.
After Width: | Height: | Size: 464 KiB |
Binary file not shown.
After Width: | Height: | Size: 509 KiB |
Binary file not shown.
After Width: | Height: | Size: 482 KiB |
Binary file not shown.
After Width: | Height: | Size: 308 KiB |
Loading…
Reference in New Issue