투명한 png 이미지 “foo.png”가 있고 다른 이미지를 열었습니다.
im = Image.open("foo2.png");
이제 내가 필요한 것은 foo.png를 foo2.png와 병합하는 것입니다.
(foo.png에는 일부 텍스트가 포함되어 있으며 foo2.png에 해당 텍스트를 인쇄하고 싶습니다)
답변
import Image
background = Image.open("test1.png")
foreground = Image.open("test2.png")
background.paste(foreground, (0, 0), foreground)
background.show()
첫 번째 매개 변수 .paste()
는 붙여 넣을 이미지입니다. 두 번째는 좌표이고 비밀 소스는 세 번째 매개 변수입니다. 이미지 붙여 넣기에 사용될 마스크 를 나타냅니다 . 투명도가있는 이미지를 전달하면 알파 채널이 마스크로 사용됩니다.
문서를 확인하십시오 .
답변
Image.paste
배경 이미지에 투명도가 포함되어 있으면 예상대로 작동하지 않습니다. 실제 알파 합성 을 사용해야 합니다.
Pillow 2.0에는이를 alpha_composite
수행 하는 기능이 포함되어 있습니다 .
background = Image.open("test1.png")
foreground = Image.open("test2.png")
Image.alpha_composite(background, foreground).save("test3.png")
편집 : 두 이미지 모두 RGBA 유형이어야합니다. 따라서 convert('RGBA')
팔레트 등이 있으면 호출해야합니다 . 배경에 알파 채널이없는 경우 일반 붙여 넣기 방법을 사용할 수 있습니다 (더 빠름).
답변
으로 OLT 이미 지적 Image.paste
제대로 작동하지 않는 경우 소스 및 대상 모두 알파가 포함되어 있습니다.
다음 시나리오를 고려하십시오.
두 개의 테스트 이미지는 모두 알파를 포함합니다.
layer1 = Image.open("layer1.png")
layer2 = Image.open("layer2.png")
다음을 사용하여 이미지 합성 Image.paste
:
final1 = Image.new("RGBA", layer1.size)
final1.paste(layer1, (0,0), layer1)
final1.paste(layer2, (0,0), layer2)
다음 이미지를 생성합니다 (오버레이 된 빨간색 픽셀의 알파 부분은 2 번째 레이어에서 완전히 가져옵니다. 픽셀이 올바르게 혼합되지 않음).
다음을 사용하여 이미지 합성 Image.alpha_composite
:
final2 = Image.new("RGBA", layer1.size)
final2 = Image.alpha_composite(final2, layer1)
final2 = Image.alpha_composite(final2, layer2)
다음과 같은 (정확한) 이미지를 생성합니다 :
답변
블렌딩을 사용할 수도 있습니다.
im1 = Image.open("im1.png")
im2 = Image.open("im2.png")
blended = Image.blend(im1, im2, alpha=0.5)
blended.save("blended.png")
답변
def trans_paste(bg_img,fg_img,box=(0,0)):
fg_img_trans = Image.new("RGBA",bg_img.size)
fg_img_trans.paste(fg_img,box,mask=fg_img)
new_img = Image.alpha_composite(bg_img,fg_img_trans)
return new_img
답변
비슷한 질문이 있었고 답을 찾는 데 어려움이있었습니다. 다음 기능을 사용하면 특정 오프셋에서 다른 이미지 위에 투명도 매개 변수가있는 이미지를 붙여 넣을 수 있습니다.
import Image
def trans_paste(fg_img,bg_img,alpha=1.0,box=(0,0)):
fg_img_trans = Image.new("RGBA",fg_img.size)
fg_img_trans = Image.blend(fg_img_trans,fg_img,alpha)
bg_img.paste(fg_img_trans,box,fg_img_trans)
return bg_img
bg_img = Image.open("bg.png")
fg_img = Image.open("fg.png")
p = trans_paste(fg_img,bg_img,.7,(250,100))
p.show()
답변
필자는 @ P.Melch 사용자가 작성한 의견 과 내가 작업중 인 프로젝트에서 @Mithril 이 제안한 의견을 스스로 코딩 했습니다.
나는 범위 안전을 벗어났습니다. 여기에 대한 코드가 있습니다 . (이 저장소의 미래에 상황이 바뀔 수 있기 때문에 특정 커밋을 연결했습니다)
참고 : np.array(Image.open(...))
입력 A와 B copy_from
와이 연결된 함수 overlay
인수 와 같이 이미지에서 numpy 배열을 기대 합니다.
종속성은 copy_from
슬라이싱을위한 PIL 이미지 컨텐츠로서의 직전의 함수, 메소드 및 numpy 배열입니다.
파일은 클래스 지향적이지만 해당 함수를 사용 overlay_transparent
하려면의 이름 self.frame
을 배경 이미지 numpy 배열 로 바꾸십시오 .
또는 전체 파일을 복사하고 (일부 가져 오기 및 Utils
클래스를 제거 할 수 있음 )이 Frame 클래스와 상호 작용할 수 있습니다.
# Assuming you named the file frame.py in the same directory
from frame import Frame
background = Frame()
overlay = Frame()
background.load_from_path("your path here")
overlay.load_from_path("your path here")
background.overlay_transparent(overlay.frame, x=300, y=200)
그런 다음 background.frame
오버레이 및 알파 합성 배열로 PIL 이미지를 얻을 수 있습니다 overlayed = Image.fromarray(background.frame)
.
overlayed = Frame()
overlayed.load_from_array(background.frame)
또는 background.save("save path")
알파 합성 내부 self.frame
변수 에서 직접 가져 오는 것처럼 .
당신은 파일을 읽고 방법처럼 코딩이 구현 I와 다른 좋은 기능을 찾을 수 있습니다 get_rgb_frame_array
, resize_by_ratio
, resize_to_resolution
, rotate
, gaussian_blur
, transparency
, vignetting
🙂
resolve_pending
해당 프로젝트에 고유 한 메소드 를 제거하고 싶을 것입니다 .
내가 당신을 도우면 기쁘다. 내가 이야기 하고있는 프로젝트 의 저장소를 확인하십시오 .이 질문과 스레드는 개발에 많은 도움이되었습니다. 🙂