2012-12-06 2 views
4

현재 질문에 대한 답변을 제공하는 많은 질문이 여기에 있지만 출력이 예상과 다릅니다.알파 채널이있는 두 이미지의 PIL 병합 - 예상대로 작동하지 않습니다.

목표는 두 개의 RGBA 이미지를 병합하는 것입니다. 각 이미지의 알파 채널에 대한 정보가 동일하지 않습니다.

전류 (단순화 된) 코드 :

from PIL import Image 

image = '1.png' 
watermark = '2.png' 

wmark = Image.open(watermark) 
img = Image.open(image) 

img.paste(wmark, (0, 0), wmark) 
img.save("result.png", "PNG") 

두 영상은 :

배경

Background

전경

Foreground

,

당신은 차이를 볼 수없는 경우

Actual result

출력

Expected output

실제 결과는, 여기에 알파 채널은 최종 버전의 (더 나은 시각화를 위해 반전) 예상 .

예상 결과 - 알파 채널

Expected result - alpha channel

실제 결과 - 알파 채널

말했다 너무 Actual result - alpha channel

,이 일을 어떤 방법이 아니면 내가 뭔가 잘못하고있는 중이 야 ?

편집 - 설명 다음 @zenpoy 코멘트 : 전경 이미지가 불투명의 일정 금액이있는 경우

, 나는 두 이미지를 중첩 때 고려되어야한다,하지만 난의 알파 채널을하지 않으려합니다 첫 번째 이미지에 추가 할 두 번째 이미지. 종이 이미지 (배경) 앞에 유리 조각 (전경 이미지)을 넣는 것과 같습니다.

즉, 배경 이미지가 RGBA 대신 RGB 인 경우 최종 이미지에는 알파 정보가 없어야합니다.

+0

달성하려는 목표에 대한 수학적 설명을 제공 할 수 있습니까? 각 채널에서 각 픽셀의 가치에서 기대하는 것은 무엇입니까? – zenpoy

+0

필자는 PIL이 알파를 제대로 처리하지 못함에 대해 계속해서 실망합니다. –

답변

3

초기 설명에서 다음 아이디어가 동등한 것 같습니다. X, Y를 두 개의 RGBA 이미지라고합시다. X에서 밴드 RGB와 Y에서 RGBA 밴드를 고려하여 이미지 Z를 생성합니다. Z에서 밴드 A를 X에서 밴드 A의 밴드 A로 설정합니다. 이것은 최종 진술과 모순되지만 예상했던 것 이 상황에서 출력.

image = '1.png' 
watermark = '2.png' 

wmark = Image.open(watermark) 
img = Image.open(image) 

ia, wa = None, None 
if len(img.getbands()) == 4: 
    ir, ig, ib, ia = img.split() 
    img = Image.merge('RGB', (ir, ig, ib)) 
if len(wmark.getbands()) == 4: 
    wa = wmark.split()[-1] 

img.paste(wmark, (0, 0), wmark) 
if ia: 
    if wa: 
     # XXX This seems to solve the contradiction, discard if unwanted. 
     ia = max_alpha(wa, ia) 
    img.putalpha(ia) 

img.save('result.png') 

기능 max_alpha은 다음과 같습니다 :

def max_alpha(a, b): 
    # Assumption: 'a' and 'b' are of same size 
    im_a = a.load() 
    im_b = b.load() 
    width, height = a.size 

    alpha = Image.new('L', (width, height)) 
    im = alpha.load() 
    for x in xrange(width): 
     for y in xrange(height): 
      im[x, y] = max(im_a[x, y], im_b[x, y]) 
    return alpha 

이 새로운 기능은 고려 언급 한 모순을 보인다

그래서,이 코드입니다.

+0

어떤 버전의 PIL을 사용하고 있습니까? 여기에 1.1.7이 있습니다. 최소한이 예제에서 제공 한 이미지들로 인해 여러분의 코드는 내부 PIL 에러'AttributeError :'NoneType '객체가'/ usr/lib64/python2'에 'bands'속성을 가지고 있지 않은 상태에서'img.split()'에 실패하고 있습니다. 7/사이트 패키지/PIL/Image.py ", 라인 1497' – Unode

+1

내가 너무 1.1.7를 가지고 있고, 그 조금 이상하다. img.load()'추가 시도'선 후 IMG = Image.open는 (' 이미지)'. – mmgp

+0

'img.load()가'트릭을했다. – Unode

관련 문제