channels_split_cmyk.py 3.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. # Channels > Split CMYK
  2. # (fr) Canaux > Séparer CMJN
  3. from lazpaint import image, dialog, layer, filters
  4. translation = dialog.translate_dict(["Layer already split", "Cyan", "Magenta", "Yellow", "Black", "Alpha"])
  5. # check if it is a channel
  6. if layer.get_registry("split-channel") is not None:
  7. dialog.show_message(translation["Layer already split"])
  8. exit()
  9. layer_id = layer.get_id()
  10. layer_index = image.get_layer_index()
  11. layer_opacity = layer.get_opacity()
  12. layer_transparent = layer.is_transparent()
  13. cmy_id = None
  14. black_id = None
  15. # check if it has been split
  16. if layer.get_registry("split-channels-id") is not None:
  17. for cur_layer_id in image.iterate_layers():
  18. if layer.get_registry("split-source-id") == layer_id:
  19. dialog.show_message(translation["Layer already split"])
  20. exit()
  21. image.do_begin()
  22. channels = []
  23. if layer_transparent:
  24. channels.append({"name": "Alpha", "channel": "A", "red": "alpha", "green": "alpha", "blue": "alpha", "alpha": "255"})
  25. channels.append({"name": "Black", "channel": "K", "red":"max(max(red,green),blue)", "green": "max(max(red,green),blue)", "blue": "max(max(red,green),blue)", "alpha": "255"})
  26. #channels.append({"name": "Black", "channel": "K", "hue":"0", "saturation": "0", "lightness": "max(max(red,green),blue)", "alpha": "255"})
  27. channels_id = []
  28. for ch in channels:
  29. layer.select_id(layer_id)
  30. layer.duplicate()
  31. filters.filter_function(red = ch.get("red"), green = ch.get("green"), blue = ch.get("blue"), hue = ch.get("hue"), saturation = ch.get("saturation"), lightness = ch.get("lightness"), alpha = ch["alpha"], gamma_correction = False, corrected_hue = False)
  32. layer.set_name(translation[ch["name"]])
  33. layer.set_opacity(layer_opacity)
  34. if ch["channel"] == "A":
  35. layer.set_blend_op(layer.BLEND_MASK)
  36. layer.set_registry("split-channel", ch["channel"])
  37. layer.set_registry("split-source-id", layer_id)
  38. if ch["channel"] == "K":
  39. black_id = layer.get_id()
  40. layer.duplicate()
  41. layer.set_blend_op(layer.BLEND_DIVIDE)
  42. black_div_id = layer.get_id()
  43. layer.select_id(layer_id)
  44. layer.duplicate()
  45. copy_index = image.get_layer_index()
  46. image.move_layer_index(copy_index, copy_index + 1)
  47. image.select_layer_index(copy_index + 2)
  48. layer.merge_over()
  49. cmy_id = layer.get_id()
  50. else:
  51. channels_id.append(layer.get_id())
  52. if cmy_id is not None:
  53. channels = []
  54. channels.append({"name": "Cyan", "channel": "C", "red": "red", "green": "1", "blue": "1", "alpha": "255"})
  55. channels.append({"name": "Magenta", "channel": "M", "red": "1", "green": "green", "blue": "1", "alpha": "255"})
  56. channels.append({"name": "Yellow", "channel": "Y", "red": "1", "green": "1", "blue": "blue", "alpha": "255"})
  57. channels[-1]["last"] = True
  58. for ch in channels:
  59. layer.select_id(cmy_id)
  60. if ch.get("last") is None:
  61. layer.duplicate()
  62. filters.filter_function(red = ch.get("red"), green = ch.get("green"), blue = ch.get("blue"), alpha = ch["alpha"], gamma_correction = False)
  63. layer.set_name(translation[ch["name"]])
  64. layer.set_opacity(layer_opacity)
  65. layer.set_blend_op(layer.BLEND_MULTIPLY)
  66. layer.set_registry("split-channel", ch["channel"])
  67. layer.set_registry("split-source-id", layer_id)
  68. channels_id.append(layer.get_id())
  69. if black_id is not None:
  70. channels_id.append(black_id)
  71. layer.select_id(layer_id)
  72. layer.set_registry("split-channels-id", channels_id)
  73. layer.set_visible(False)
  74. image.do_end()