kimpro82 / MyGame

Game is to handle data
0 stars 0 forks source link

RTK2 : Get Portraits from `KAODATA.DAT` (Trial 1) #74

Closed kimpro82 closed 1 year ago

kimpro82 commented 1 year ago

References

kimpro82 commented 1 year ago

by ChatGPT

이미지 처리를 위한 Python 라이브러리인 Pillow(PIL)을 이용하면 간단하게 구현할 수 있습니다. 다음은 파일을 읽어서 8비트씩 끊어서 GIF 이미지로 변환하는 코드입니다.

from PIL import Image

# 파일 읽기
with open('example_file.bin', 'rb') as f:
    data = f.read()

# 8비트 단위로 끊기
chunks = [data[i:i+8] for i in range(0, len(data), 8)]

# GIF 이미지 생성
gif_frames = []
for chunk in chunks:
    # 각 바이트를 픽셀값으로 변환
    pixels = [int(b) for b in chunk]
    # 이미지 생성
    img = Image.new('1', (8, 1), 0)
    img.putdata(pixels)
    # GIF 프레임 추가
    gif_frames.append(img)

# GIF 파일 저장
gif_frames[0].save('example_output.gif', format='GIF', append_images=gif_frames[1:], save_all=True, duration=100, loop=0)

이 코드는 example_file.bin 파일을 읽어서 8비트씩 끊은 뒤, 각 바이트 값을 픽셀값으로 변환하여 1x8 크기의 이미지를 생성합니다. 이렇게 생성한 이미지들을 GIF 프레임으로 모아서 example_output.gif 파일로 저장합니다. 저장할 때 durationloop 매개변수를 이용해 애니메이션 속도와 루프 여부를 설정할 수 있습니다.

kimpro82 commented 1 year ago

by ChatGPT

  1. 바이너리 데이터를 불러옵니다. 예를 들어, "example.bin"이라는 파일로 가정하겠습니다.

    with open("example.bin", "rb") as f:
    data = f.read()
  2. 3비트씩 데이터를 추출합니다. 이를 위해, 다음과 같이 비트 연산을 사용할 수 있습니다:

    pixels = []
    for byte in data:
    for i in range(8):  # 8비트(1바이트)에 대해서 반복합니다.
        # 3비트씩 데이터를 추출합니다.
        pixel_value = (byte >> (3*i)) & 0b111  
        pixels.append(pixel_value)
  3. 8색 팔레트를 정의합니다. 이 예에서는 다음과 같이 RGB 값으로 구성된 팔레트를 사용하겠습니다:

    palette = [
    (0, 0, 0),        # Black
    (255, 255, 255),  # White
    (255, 0, 0),      # Red
    (0, 255, 0),      # Green
    (0, 0, 255),      # Blue
    (255, 255, 0),    # Yellow
    (255, 0, 255),    # Magenta
    (0, 255, 255),    # Cyan
    ]
  4. 각 픽셀 값을 팔레트 색상으로 변환합니다:

    image_data = [palette[pixel_value] for pixel_value in pixels]
  5. 이제 gif 파일을 생성합니다. 이 작업을 위해, Pillow 라이브러리를 사용할 수 있습니다.

    
    from PIL import Image

이미지 크기는 1x(len(pixels)) 입니다.

width, height = 1, len(pixels) im = Image.new("RGB", (width, height))

이미지 데이터를 픽셀 단위로 적용합니다.

im.putdata(image_data)

gif 파일로 저장합니다.

im.save("output.gif", "GIF")



이렇게 하면 "output.gif" 파일이 생성되고, 각 픽셀이 8색 팔레트에 대응하는 gif 이미지를 얻을 수 있습니다.
kimpro82 commented 1 year ago

by ChatGPT

pixel_value = (byte >> (3*i)) & 0b111 행은 주어진 바이너리 데이터에서 3비트 단위로 데이터를 추출하기 위한 코드입니다.

여기서, byte는 현재 처리 중인 8비트 바이트입니다. 3*i는 현재 처리 중인 비트의 위치입니다. 예를 들어, i=0일 때, 0번째 비트를 처리하는 것이며, i=1일 때, 3번째 비트를 처리하는 것입니다. 따라서, byte >> (3*i)는 현재 처리 중인 비트의 위치에 맞춰서 바이트 데이터를 오른쪽으로 이동시키고, 오른쪽으로 이동된 데이터에서 가장 오른쪽 3비트만 추출하는 것입니다.

이렇게 추출된 3비트 데이터는 0b111과 비트 연산자 &를 사용하여 마스킹합니다. 0b111은 이진수로 7을 나타내는데, 이것과 &를 사용하면 추출된 3비트 데이터가 0부터 7까지의 값을 가지도록 보장할 수 있습니다. 즉, 3비트 데이터가 7보다 큰 경우에는 7로 대체됩니다.

따라서, pixel_value에는 0부터 7까지의 값을 가지는 3비트 데이터가 할당됩니다.