2012-05-24 2 views
1

작은 조각으로 레이어를 분할하는 스크립트를 작성하려고합니다. 올바르게 실행되지만 새 레이어에는 아무 것도 붙여 넣지 않습니다.Python-fu GIMP 스크립트는 이미지를 붙여 넣지 않습니다.

def explode_layer(i, l, dx, dy): 
    T=[] 
    for ix,ox in enumerate(range(l.offsets[0], l.offsets[0]+l.width, dx)): 
     for iy,oy in enumerate(range(l.offsets[1], l.offsets[1]+l.height, dy)): 
      pdb.gimp_rect_select(i, ox, oy, dx, dy, 2, False, 0) 
      if not pdb.gimp_edit_copy(l): 
       continue 
      layer = pdb.gimp_layer_new(i, dx, dy, 1, 
             l.name+" %d,%d"%(ix,iy), 100, 0) 
      i.add_layer(layer) 
      floating_sel = pdb.gimp_edit_paste(layer, True) 
      pdb.gimp_layer_set_offsets(floating_sel, *layer.offsets) 
      pdb.gimp_floating_sel_anchor(floating_sel) 
      T.append(layer) 
    return T 

저는 우분투 10.04에서 gimp 2.6.8을 사용합니다. 어떻게 해결할 수 있습니까? 더 좋은 방법이 있습니까?

+0

나중에 문제가 생길 수 있습니다. 그 중 일부는 거대 할 수 있습니다. 하나의 문자로 변수의 이름을 지정하지 마십시오. 특히 "이미지"의 i와 같이 완전히 깃털이있는 객체를 지정하지 마십시오. "및"l "은 레이어입니다. 무엇보다 - 변수 이름에 단일 문자 "l"을 사용하지 마십시오. "1"과 구별하기가 너무 어렵습니다. 2) "마술 숫자"사용하지 않기 - 김프 파이썬은 상수를 정의하고 사용하므로 숫자 "2"대신 "CHANEL_OP_REPLACE"를 사용하면 스크립트를 미래의 증거로 만들 수 있습니다. – jsbueno

+0

조언을 주셔서 감사합니다. 플러그인을 작성하지 않고 python-fu 콘솔에서 사용하기 만합니다. 김프 스크립팅으로 더 좋아지면, 나는 갬프를 만드는 것을 고려할 것입니다. – Arpegius

+0

ok - 그런 단축키는 "한 번 실행"콘솔 창에 대해서는 문제가 없지만 일단 고정되면이 코드는 플러그인입니다. 이미 "등록"기능 호출 만 작성하면됩니다. – jsbueno

답변

1

지금 당신의 스크립트를 살펴 보겠습니다. 좋은 접근 방법입니다. 그리고 무엇이 잘못되었는지 알았습니다 : gimp_edit_paste를 호출하면 생성 한 선택 사항 (gimp_rect_select로)이 여전히 활성화되고 귀하의 떠 다니는 레이어가 그것에 의해 잘립니다. (실제로 나는 그들이 "selection_anchor"호출에서 단지 클립핑이라고 생각하지만, 그것은 부적절합니다.)

그래서하는 pdb.gimp_selection_none(i) 줄을 추가하기 직전 floating_sel = pdb.gimp_edit_paste(layer, True) 수정 함수가 :

def explode_layer(i, l, dx, dy): 
    T=[] 
    for ix,ox in enumerate(range(l.offsets[0], l.offsets[0]+l.width, dx)): 
     for iy,oy in enumerate(range(l.offsets[1], l.offsets[1]+l.height, dy)): 
      pdb.gimp_rect_select(i, ox, oy, dx, dy, 2, False, 0) 
      if not pdb.gimp_edit_copy(l): 
       continue 
      layer = pdb.gimp_layer_new(i, dx, dy, 1, 
             l.name+" %d,%d"%(ix,iy), 100, 0) 
      i.add_layer(layer) 
      pdb.gimp_selection_none(i) 
      floating_sel = pdb.gimp_edit_paste(layer, True) 
      pdb.gimp_layer_set_offsets(floating_sel, *layer.offsets) 
      pdb.gimp_floating_sel_anchor(floating_sel) 
      T.append(layer) 
    return T 

간단한 방법은, 명시 적으로 새 레이어를 생성하지 않습니다 (BTW, 편리한, 문서화되지 않은 "new_layer"하지만 방법이있다 새 레이어를 만들고 추가하는 이미지 개체에 있으며 대부분의 매개 변수에 정상적인 기본값이 있습니다. 따라서 i.new_layer(<name>, <width>, <height>)이면 충분합니다.) 그러나 복사하여 붙여 넣기 만하면 new_layer = pdb.gimp_floating_sel_to_layer(<floating_sel>)을 대신 호출 할 수 있습니다.

+0

새 레이어에 붙이는'gimp_floating_sel_ *'메서드가 있습니까? 나는 하나도 찾지 못했다. – Arpegius

+0

감사합니다. 잘 작동합니다. 붙여 넣기 사용 선택도 잊었습니다. 새 레이어를 부동 레이어로 이동해도 선택 영역이 새 레이어 위에 맞습니다. 'gimp_floating_sel_to_layer'의 문서에서, 새로운 레이어를 만드는 것에 대해 아무것도 알지 못했기 때문에 나는 그것을 놓쳤습니다. – Arpegius