================ 최종 파일 ==================
ef.py
어이없게도 다른사이트에서 찿은 변환 프로그램이 정상 작동을 안함...
그에 반해 내 프로그램은 아주 잘 작동됨.
물론 효율은 떨어지긴 하겠지만
최소한 100%는 제대로 작동되니 위안중
근데 이미지 결과물이 세로 반전이 되있는데
이걸 프로그래밍으로 재정렬 할 늘역이 나한텐 안됨;;
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
import codecs
import os
#원본 파일 경로
ori_file = sys.argv[1]
mx = os.path.getsize(ori_file)
print mx , "Bytes"
#원본 파일 준비
f_in = open(ori_file,'rb')
print
print "처음 위치","%X" %f_in.tell()
f_in.seek(8)
abc='abcdefghijklmnopqrstuvwxyz'
for a in abc:
print "파일 크기:",mx ,"현재 위치",f_in.tell()
if mx<=(f_in.tell()+4):
sys.exit()
print
L=''
for vl in range(0,32):
s=f_in.read(1)
L=L+s
print '%02X' % int(ord(s)), # 1바이트씩 출력
#print L.encode("hex")
L=L.encode("hex")
#print L
n=L.find('2000')
#print n
skt=n/2-4
f_in.seek(-32,1)
#print "%X" %f_in.tell()
#skt=input('jump:')
print "===" + a + "==="
#tga 파일 준비
f_out = open(ori_file+a+".tga",'wb')
#tga 파일 쓰기
#f_out.write(f_in.read())
#tga 헤드 입력
f_out.write(chr(0x00))
f_out.write(chr(0x00))
f_out.write(chr(0x02))
f_out.write(chr(0x00))
f_out.write(chr(0x00))
f_out.write(chr(0x00))
f_out.write(chr(0x00))
f_out.write(chr(0x00))
f_out.write(chr(0x00))
f_out.write(chr(0x00))
f_out.write(chr(0x00))
f_out.write(chr(0x00))
#ani 가로세로 정보 위치로 이동
print "이동전 위치:","%X" %f_in.tell() #0
f_in.seek(skt,1)
#가로 읽기
print "가로 읽기전 위치1:","%X" %f_in.tell() #22
w1=ord(f_in.read(1))
f_out.write(chr(w1))
#print "w1"
#print w1
#print "가로 읽기전 위치2:","%X" %f_in.tell() #23
w2=ord(f_in.read(1))
f_out.write(chr(w2))
#print "w2"
#print w2
w3=w1+w2*256
print "가로크기:",w3
#tga에 가로 쓰기
if w2>1:
print "w3>255"
f_out.write(chr(0x00))
#세로 읽기
print "세로 읽기전 위치1:","%X" %f_in.tell()
h1=ord(f_in.read(1))
f_out.write(chr(h1))
#print "세로 읽기전 위치2:","%X" %f_in.tell()
h2=ord(f_in.read(1))
f_out.write(chr(h2))
h3=h1+h2*256
print "세로크기:",h3
if h2>256:
#print f_in.tell()
f_out.write(chr(0x00))
#tga 헤더 끝
f_out.write(chr(0x20))
f_out.write(chr(0x08))
#읽기 이동
print "데이터 이동전 위치:","%X" %f_in.tell()
f_in.seek(6,1)
#print int(w)*int(h)
#ga에 이미지 데이터 쓰기
#print "데이터 쓰기전 위치1"
#print "%X" %f_in.tell()
f_out.write(f_in.read(w3*h3))
#print "데이터 쓰기전 위치2"
#print "%X" %f_in.tell()
f_out.write(f_in.read(w3*h3))
#print "데이터 쓰기전 위치3"
#print "%X" %f_in.tell()
f_out.write(f_in.read(w3*h3))
#print "데이터 쓰기전 위치4"
#print "%X" %f_in.tell()
f_out.write(f_in.read(w3*h3))
#파일 닫기
f_out.close()
f_in.close()
================= 이하 이전 내용 =================
http://blog.naver.com/lilly1987/92364500
ef - a fairy tale of the two - the first tale 에서 추출한 ani 파일 tga 변환법
tga 무압축 형식인데다가 구조도 졸래 간단해서 다행이였음
뭐 데이터 구조 이해를 잘 아시는 분이시면 이 스샤 한장으로도 충분..
초급인 나한텐 이정도가 한계
문제는 헤더 크기가 일정하지 않다는점[이게 치명적. 스크립트가 길어지는 원인]
결국 20 00 라는 문자열 위치를 찿아야 하는데
찿는 스크립트를 못짜겠어 ㅅㅂ...
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
#원본 파일 경로
ori_file = sys.argv[1]
#원본 파일 준비
f_in = open(ori_file,'rb')
print "처음 위치"
print "%X" %f_in.tell()
f_in.seek(10)
abc='abcdef'
for a in abc:
print "===" + a + "==="
#tga 파일 준비
f_out = open(ori_file+a+".tga",'wb')
#tga 파일 쓰기
#f_out.write(f_in.read())
#tga 헤드 입력
f_out.write(chr(0x00))
f_out.write(chr(0x00))
f_out.write(chr(0x02))
f_out.write(chr(0x00))
f_out.write(chr(0x00))
f_out.write(chr(0x00))
f_out.write(chr(0x00))
f_out.write(chr(0x00))
f_out.write(chr(0x00))
f_out.write(chr(0x00))
f_out.write(chr(0x00))
f_out.write(chr(0x00))
#ani 가로세로 정보 위치로 이동
print "이동전 위치"
print "%X" %f_in.tell() #0
f_in.seek(12,1)
#가로 읽기
print "가로 읽기전 위치1"
print "%X" %f_in.tell() #22
w1=ord(f_in.read(1))
f_out.write(chr(w1))
print "w1"
print w1
print "가로 읽기전 위치2"
print "%X" %f_in.tell() #23
w2=ord(f_in.read(1))
f_out.write(chr(w2))
print "w2"
print w2
w3=w1+w2*256
print "w3"
print w3
#tga에 가로 쓰기
if w2>1:
print "w3>255"
f_out.write(chr(0x00))
#세로 읽기
print "세로 읽기전 위치1"
print "%X" %f_in.tell()
h1=ord(f_in.read(1))
f_out.write(chr(h1))
print "세로 읽기전 위치2"
print "%X" %f_in.tell()
h2=ord(f_in.read(1))
f_out.write(chr(h2))
h3=h1+h2*256
if h2>256:
#print f_in.tell()
f_out.write(chr(0x00))
#tga 헤더 끝
f_out.write(chr(0x20))
f_out.write(chr(0x08))
#읽기 이동
print "데이터 이동전 위치"
print "%X" %f_in.tell()
f_in.seek(6,1)
#print int(w)*int(h)
#ga에 이미지 데이터 쓰기
print "데이터 쓰기전 위치1"
print "%X" %f_in.tell()
f_out.write(f_in.read(w3*h3))
print "데이터 쓰기전 위치2"
print "%X" %f_in.tell()
f_out.write(f_in.read(w3*h3))
print "데이터 쓰기전 위치3"
print "%X" %f_in.tell()
f_out.write(f_in.read(w3*h3))
print "데이터 쓰기전 위치4"
print "%X" %f_in.tell()
f_out.write(f_in.read(w3*h3))
#파일 닫기
f_out.close()
f_in.close()
프로그램 시작
새파일1 생성
00 00 02 00
00 00 00 00
00 00 00 00
값을 새파일1 쓴다
원본 읽기 위치를 10바이트 건너 띈다 [원본 파일 읽기 위치를 0x12 로 이동]
원본 파일 0x12 부터 2바이트값을 얻어서[이미지 가로 크기] 새파일1에 이어서 쓴다.
동시에 변수 w 에 넣는다.
원본 파일 0x14 부터 2바이트값을 얻어서[이미지 세로 크기] 새파일1에 이어서 쓴다.
동시에 변수 h 에 넣는다.
20 08 값을 새파일1에 이어서 쓴다
원본 읽기 위치를 4바이트 건너 띈다 [원본 읽기 위치를 0x1c로 이동]
원본 파일 0x1c 부터 w * h * 4 바이트 만큼의 데이터량을 복사해서 새파일1에 이어서 쓴다.
원본 읽기 위치를 8바이트 건너 띈다 [만약 데이터 없으면 프로그램 중지] -여기부터 루트
새파일2 생성
00 00 02 00
00 00 00 00
00 00 00 00
값을 쓴다
2바이트값을 읽어서[그만큼 읽기 위치 이동] 새파일2에 이어서 쓴다.
동시에 변수 w 에 넣는다.
2바이트값을 읽어서[그만큼 읽기 위치 이동] 새파일2에 이어서 쓴다.
동시에 변수 h 에 넣는다.
20 08 값을 새파일2에 이어서 쓴다
원본 파일 부터 w * h * 4 바이트 만큼의 데이터량을 복사해서 새파일2에 이어서 쓴다. - 루트 끝
자.. 이걸 어떨게 프로그램으로 구현 한다..?
필요한건 저 프로그램과 Hex 에 대한 지식 약간과 tga 파일 구조에 관한 앏팍한 지식만 있으면 끝
셜명은 이미지 참조 ㄳ
아참 이미지에 설명을 안적어 놨는데
파랑색 : 절대 지워져선 안되는 귀중한 이미지 데이터 부분
만약 1바이트라도 실수로 지우면
색이 반전된다거나 , 이미지가 1픽셀식 이동한다거나
같은 이상한 이미지만을 추출하게 될것이야
노랑색 : 추출할 이미지 크기임(2바*2이트) ,
예) 가로 크기(2바이트) 0F 00 , 세로크기(2바이트) 0D 00
하늘색 : 추출할 이미지가 위치할 좌표(2*2바이트) ,
예 ) 가로 좌표(2바이트) B1 00 [ 0xB1 = 177 ] , 세로 좌표(2바이트) 92 00 [0x92 = 146 ]
지금 수정하고 있는 파일이 st_kei01a10.ani 이니까 st_kei01a10.png 에서의 위치임
붉은색,분홍색 : 게임상에서의 정보인듯 무시하자 , 그냥 다 0x00 으로 만들어 버리고
데이터의 맨 앞부분만 tga 정보로 바꾸자[첨부이미지의 오른쪽처럼]
tga 구조 : 맨 앞의 18바이트가 tga의 형식 파일
다른건 다 필요 없고[00으로 만들어 버리고]
0x02 -> 02 00
0x0C -> 추출할 이미지의 가로크기 , 예) 위에서 구한 B1 00 [ 0xB1 = 177 ]
0x0E -> 추출할 이미지의 가로크기*2~4 , 예) 계산하기 귀찬으면 닥치고 00 01
0x10 -> 20 08
이것만 적어주고 tga 확장자로 저장하면 일단 이미지 추출.
여기서 한가지 더 작업 할게 있는데
흰색 부분이 있고 [이건 별수없음]
추출한 파일마다 좌우 대칭이거나
회전 한다거나 되어있기때문에
이미지 편집프로그램으로 반드시 수정해줘야함.
이정도로 해줬는데 누구 이미지 변환 프로그램 만들사람 없수? ㅜㅜ
난 프로그램 만들줄 모른단 말이야!! ㅜㅜ