split_rgb_pillow.py 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. # Split RGB channels (using Pillow)
  2. from lazpaint import image, dialog, layer
  3. try:
  4. from PIL import Image
  5. except ImportError:
  6. dialog.show_message("Please install Pillow for Python.")
  7. exit()
  8. # check if it is a channel
  9. if layer.get_registry("split-channel") is not None:
  10. dialog.show_message("Layer already split")
  11. exit()
  12. layer_id = layer.get_id()
  13. layer_index = image.get_layer_index()
  14. layer_opacity = layer.get_opacity()
  15. layer_transparent = layer.is_transparent()
  16. # check if it has been split
  17. if layer.get_registry("split-channels-id") is not None:
  18. for i in range(1, layer.get_count()):
  19. image.select_layer_index(i)
  20. if layer.get_registry("split-source-id") == layer_id:
  21. dialog.show_message("Layer already split")
  22. exit()
  23. layer.select_id(layer_id)
  24. temp_name = image.get_temporary_name()
  25. temp_name = layer.save_as(temp_name)
  26. if temp_name is None:
  27. dialog.show_message("Failed to retrieve layer")
  28. exit()
  29. im = Image.open(temp_name)
  30. width, height = im.size
  31. zero = Image.new("L", (width, height))
  32. r = Image.merge("RGB", [im.getchannel("R"), zero, zero])
  33. g = Image.merge("RGB", [zero, im.getchannel("G"), zero])
  34. b = Image.merge("RGB", [zero, zero, im.getchannel("B")])
  35. image.do_begin()
  36. layer.select_id(layer_id)
  37. layer.set_visible(False)
  38. channels = [(r, "Red", "R"), (g, "Green", "G"), (b, "Blue", "B")]
  39. if layer_transparent:
  40. a = im.getchannel("A")
  41. channels.insert(0, (a, "Alpha", "A"))
  42. channels_id = []
  43. for ch in channels:
  44. ch[0].save(temp_name, "BMP")
  45. layer.add_from_file(temp_name)
  46. layer.set_name(ch[1] + " channel")
  47. layer.set_opacity(layer_opacity)
  48. if ch[2] == "A":
  49. layer.set_blend_op(layer.BLEND_MASK)
  50. elif ch[2] != channels[-1][2]:
  51. layer.set_blend_op(layer.BLEND_LIGHTEN)
  52. layer.set_registry("split-channel", ch[2])
  53. layer.set_registry("split-source-id", layer_id)
  54. channels_id.append(layer.get_id())
  55. image.move_layer_index(image.get_layer_index(), layer_index+1)
  56. layer.select_id(layer_id)
  57. layer.set_registry("split-channels-id", channels_id)
  58. image.do_end()