merge_rgb.py 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. # Merge RGB channels
  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. channels_id = None
  9. image.do_begin()
  10. if layer.get_registry("split-channel") is not None:
  11. layer_id = layer.get_registry("split-source-id")
  12. if image.contains_layer_id(layer_id):
  13. layer.select_id(layer_id)
  14. channels_id = layer.get_registry("split-channels-id")
  15. else:
  16. channels_id = []
  17. for i in range(1, image.get_layer_count()+1):
  18. image.select_layer_index(i)
  19. cur_layer_id = layer.get_registry("split-source-id")
  20. if cur_layer_id == layer_id:
  21. channels_id.append(layer.get_id())
  22. else:
  23. layer_id = layer.get_id()
  24. channels_id = layer.get_registry("split-channels-id")
  25. if channels_id is None:
  26. dialog.show_message("Current layer is not split")
  27. exit()
  28. width, height = image.get_size()
  29. zero = Image.new("L", (width, height))
  30. one = Image.new("L", (width, height), 255)
  31. channels = {"R": zero, "G": zero, "B": zero, "A": one}
  32. temp_name = image.get_temporary_name()
  33. for ch_id in channels_id:
  34. if image.contains_layer_id(ch_id):
  35. layer.select_id(ch_id)
  36. ch = layer.get_registry("split-channel")
  37. if ch == "A":
  38. file_format = "PNG"
  39. else:
  40. file_format = "BMP"
  41. temp_name = layer.save_as(temp_name, file_format)
  42. if temp_name is None:
  43. dialog.show_message("Failed to retrieve layer")
  44. exit()
  45. channels[ch] = Image.open(temp_name).getchannel(ch)
  46. merged = Image.merge("RGBA", [channels["R"], channels["G"], channels["B"], channels["A"]])
  47. merged.save(temp_name, "PNG")
  48. for ch_id in channels_id:
  49. if image.contains_layer_id(ch_id):
  50. layer.select_id(ch_id)
  51. layer.remove()
  52. layer.add_from_file(temp_name)
  53. layer.set_name("Merged channels")
  54. new_layer_id = layer.get_id()
  55. new_layer_index = image.get_layer_index()
  56. if image.contains_layer_id(layer_id):
  57. layer.select_id(layer_id)
  58. layer_index = image.get_layer_index()
  59. layer_name = layer.get_name()
  60. layer_opacity = layer.get_opacity()
  61. image.move_layer_index(new_layer_index, layer_index+1)
  62. layer.select_id(layer_id)
  63. layer.remove()
  64. layer.select_id(new_layer_id)
  65. layer.set_name(layer_name)
  66. layer.set_opacity(layer_opacity)
  67. image.do_end()