Last active
May 21, 2023 18:18
-
-
Save p2or/7aabd929754254f5fd6013e75a0b761f to your computer and use it in GitHub Desktop.
Operator example which inverts the red channel of certain frames in the UV/Image Editor #Blender
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# http://blender.stackexchange.com/q/63561 and http://blender.stackexchange.com/q/3527 | |
import bpy | |
import os | |
# format integer with leading zeros | |
def format_numbers(number, length): | |
return '_%0*d' % (length, number) | |
def create_image_and_save_as_jpg(pixels, clp_name, clp_size, clp_frame): | |
# filename with suffix | |
filename = clp_name + format_numbers(clp_frame, 4) + ".jpg" | |
# create new image | |
image = bpy.data.images.new(filename, width=clp_size[0], height=clp_size[1]) | |
# assign the pixels | |
image.pixels = pixels | |
# get the output path from global render settings | |
output_path = bpy.context.scene.render.filepath | |
# join the name and output path | |
image.filepath_raw = os.path.join(output_path, image.name) | |
# set the file format | |
image.file_format = 'JPEG' | |
image.save() | |
#bpy.data.images.remove(image) | |
class MovieClipOperator(bpy.types.Operator): | |
bl_idname="image.invert_channel" | |
bl_label="Invert Red Channel and Save as JPEG" | |
@classmethod | |
def poll(cls, context): | |
spc = context.space_data | |
source = ["MOVIE", "SEQUENCE"] | |
return (spc.type == 'IMAGE_EDITOR' and spc.image.source in source) | |
def execute(self, context): | |
spc = context.space_data | |
# clip and space attributes | |
clp = spc.image | |
clp_usr = spc.image_user | |
clp_usr_current = clp_usr.frame_current | |
clp_usr_start = clp_usr.frame_start | |
# get the current frame | |
current_frame = clp_usr_current + clp_usr_start | |
# get the pixels | |
#pixels = spc.image.pixels[:] # read only | |
# specify the frames | |
frame_list = [1,2,3,4,5,6,7,8,9] | |
# iterate through the list | |
for frame in frame_list: | |
real_frame = frame + clp_usr_start | |
# set the frame | |
clp_usr.frame_offset = real_frame | |
# force redraw | |
spc.draw_channels = "COLOR_ALPHA" | |
spc.draw_channels = "COLOR" | |
# get the pixels and invert red channel | |
pixels = list(clp.pixels) | |
for i in range(0, len(pixels), 4): | |
pixels[i] = 1.0 - pixels[i] | |
# create image and save as jpg | |
create_image_and_save_as_jpg(pixels, clp.name, clp.size, frame) | |
# reset the offset value | |
clp_usr.frame_offset = 0 | |
self.report({"INFO"}, "Frame {} inverted".format(str(frame_list).strip('[]'))) | |
return {'FINISHED'} | |
def register(): | |
bpy.utils.register_class(MovieClipOperator) | |
def unregister(): | |
bpy.utils.unregister_class(MovieClipOperator) | |
if __name__ == "__main__": | |
register() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment