Pytohon GIF 파일 읽기 및 쓰기 편집 및 한번(PIL/Pillow)

11255 단어 PILpillowgifPython

코끼리


파이톤으로 GIF 파일을 만들고 싶어요.제작하고도 읽고 싶은데 살짝 편집해 볼게요.
내용:
  • GIF 파일 저장
  • GIF 파일 읽기
  • 읽은 GIF 데이터(GifImageFile) 처리
  • 읽고 편집해서 보관
  • GIF 파일 저장하기

    img1.save('ファイル名.gif', save_all=True, append_images=[img2, img3, ...])
    
    1. image.save(fp, format=None, **params)함수는 일반 이미지와 같은 image.save()를 사용합니다.
    2. 파일 이름 저장***.gifsave() 저장된 파일 이름의 확장자로 파일 형식을 판단할 수 있습니다.format을 사용하여 명시적으로 지정할 수도 있습니다.저장할 때 파일 이름***.gif이면 된다는 뜻이다.
    image.save('sample.png') # 拡張子から png ファイルと認識
    image.save('sample.gif') # 拡張子から gif ファイルと認識
    
    3. 매개 변수save_all,append_imagesGIF 애니메이션에 여러 이미지를 저장하기 위해 매개변수를 추가로 지정합니다.
    매개 변수
    반드시... 해야 한다
    설명
    save_all

    True.모든 프레임을 저장할 지 여부입니다.
    append_images

    목록에서 두 번째 프레임 이후의 프레임을 전달합니다.
    duration
    GIF가 재생성될 때의 프레임 간격입니다.밀리초.
    loop
    GIF가 재생성될 때의 주기 횟수입니다.0곳에서 무한 순환.
    * 추가 매개변수공식:GIF 파일 저장 옵션
    최소한save_all,append_images이 필요하며 최초 이외의 프레임append_images을 추가하는 동시에 최초 프레임을 일반적인 이미지처럼 저장합니다.
    샘플 코드:
    from PIL import Image
    
    sample_image = Image.open('sample.jpg')
    
    # transpose: 画像を反転や回転する関数
    # https://pillow.readthedocs.io/en/3.1.x/reference/Image.html#PIL.Image.Image.transpose
    image2 = sample_image.transpose(Image.ROTATE_90)
    image3 = sample_image.transpose(Image.ROTATE_180)
    image4 = sample_image.transpose(Image.ROTATE_270)
    
    sample_image.save(
        'sample_rotation.gif', 
        save_all=True, 
        append_images=[image2, image3, image4],
        duration=500,  # 各フレーム 0.5sec
        loop=0,  # 無限ループ
    )
    
    샘플 코드 저장 결과

    GIF 파일 읽기


    일반적인 이미지와 마찬가지로 Image.open() 읽을 수 있으며, 이것만 GIF 파일 PIL.GifImagePlugin.GifImageFile 클래스로 읽을 수 있습니다.
    from PIL import Image
    image = Image.open('sample.gif')
    print(type(image))
    
    <class 'PIL.GifImagePlugin.GifImageFile'>
    
    그러나 이 플러그인의 함수는 완비되지 않은 것 같습니다. 재단을 하거나 일반적인 함수를 사용하면 클래스는 자동으로 일반적인 이미지 데이터로 변하고 첫 번째 프레임의 데이터로 변합니다.
    GIF 파일로 읽는 것을 깨닫지 못하면 의외로 걸려 넘어진다.
    from PIL import Image
    image = Image.open('sample.gif')
    print(type(image))
    
    # 通常の関数を適用
    image2 = image.copy()
    print(type(image2))
    image3 = image.crop((0, 0, 100, 100))
    print(type(image3))
    
    <class 'PIL.GifImagePlugin.GifImageFile'>
    <class 'PIL.Image.Image'>  # 普通の Image オブジェクト(他フレームのデータが消える) 
    <class 'PIL.Image.Image'>
    
    ★클래스의 계층 구조는 그림과 같다.PIL.GifImagePlugin.GifImageFile도 일반 함수를 응용할 수 있다.

    읽은 GIF 데이터 처리


    GifImageFile은 다음 그림과 같이 여러 이미지를 저장하는 토대에서 포인터가 프레임을 가리키는 데이터 형식을 사용했다.

    따라서 기본적으로 GIF 데이터를 편집하려는 경우
  • 참조 프레임 위치 변경image.seek()
  • 이미지 데이터와 같은 응용 함수
  • 일반 이미지 데이터로 처리할 수 있습니다.
    GifImageFile 클래스별 함수 모음
    이름:
    설명
    seek(index)
    참조 프레임을 색인 위치로 변경합니다.
    tell()
    현재 참조한 프레임의 위치를 반환합니다.
    n_frames
    예약된 GIF 파일의 프레임 수
    * 기타 공식.

    자습서 불러오기 및 잘라내기 저장


    위의 내용에 따라 다음과 같은 절차가 된다.
  • Open을 통한 읽기
  • seek의 순서에 따라 참조 처리,
  • save로 저장
  • from PIL import Image
    
    image = Image.open('sample.gif')
    
    cropped_images = []
    crop_box = (400, 0, 700, 300)
    for index in range(image.n_frames):
        image.seek(index) # ここで image が参照しているフレームが変わっている
        cropped = image.crop(crop_box)
        cropped_images.append(cropped)
    
    # 初期フレームに残りのフレームを追加するように保存
    cropped_images[0].save(
        'sample_cropped.gif', 
        save_all=True, 
        append_images=cropped_images[1:],
        duration=500,
        loop=0,
    )
    
    결과 1왼쪽은 원래 GIF 이미지, 오른쪽은 잘린 GIF 이미지입니다.느낌이 좋다.

    (기존 GIF 데이터는여기 기사.입니다.)
    PIL의 GIF 플러그인은 GIF 파일로 저장할 때 이미지가 나빠지거나 가상이 생기는 등 완비되지 않은 느낌을 준다.저장할 때 PIL이 자동으로 작동하는optimize는False를 통해 치유할 수 있고, 먼저 RGBA에서 convert를 한 후optimize=False를 통해 치유하는 경우도 있다.

    좋은 웹페이지 즐겨찾기