2012-06-07 2 views
0

그레이 스케일 8 비트 부호없는 정수 원시 이진 파일 인 이미지 파일을 가지고 있으며이를 16 비트 파일로 변환하고 유지해야합니다. 원시 이진. 당신이 정보를 차단하기 때문에 16에서 8로가는 것이 상대적으로 쉽습니다. 그러나 나는 다른 방향으로 갈 수있는 방법이 궁금합니다.원시 이진 8 비트 부호없는 파일을 파이썬 이미징 라이브러리와 함께 서명되지 않은 16 비트로 변환합니다.

구체적으로 말해서 C++로 작성된 프로세서로 들어가는 이미지가 있고 프로세서는 16 비트 부호없는 정수 이미지 파일 만 사용하므로 내 8 비트 파일을 16 비트로 변환해야합니다. 파이썬 이미징 라이브러리로 일부 처리를하고 있지만이 특정 기능을 찾을 수 없었습니다.

UPDATE : 나는 cgohlke의 조언을 따라 논리적 보인다 다음과 같은 코드를 가지고 있지만 다음 오류 때문에 내 '최종'변수를 수락하지 않는

:

Traceback (most recent call last): 
    File "C:\Users\Patrick\workspace\colorCorrect\src\editGrayscale.py", line 36, in <module> 
    u1 = np.fromfile(final, 'uint8') 
TypeError: file() argument 1 must be encoded string without NULL bytes, not str 

내 코드 :

import Image 
import numpy as np 

fileName = raw_input("Enter a file name: ") 
saveFile = raw_input("Enter a new save file name: ") 

with open(fileName, 'rb') as f: 
    im = Image.fromstring('L', (3032, 2016), f.read()) # also try 'L;16B', 'I;16', and 'I;16B' 
    changed = im.point(lambda i: i/.4)  

final = changed.tostring() 

np.arange(256).astype('uint8').tofile(final) 

u1 = np.fromfile(final, 'uint8') 
u2 = u1.astype('uint16') 
u2 *= 257 # scale to full 16 bit range 
u2.tofile(saveFile) 

답변

1
import numpy as np 

# create example file 
np.arange(256).astype('uint8').tofile('uint8_file.bin') 

# read example file and convert to uint16 
u1 = np.fromfile('uint8_file.bin', 'uint8') 
u2 = u1.astype('uint16') 
u2 *= 257 # scale to full 16 bit range 
u2.tofile('uint16_file.bin') 
+0

내가 넣을 때 : "TypeError : file() 인수 1은 str이 아닌 NULL 바이트없이 인코딩 된 문자열이어야합니다" – clifgray

0

이 STR UCT 모듈은 당신이 당신의 독서의 자신과 파일에 작성에주의를 취할 필요가 있지만, 당신이, 변환의 종류를 할 수 있습니다,하지만 당신이 '데이터'에 저장 한 경우이 작동합니다 :

import struct 

    uint8 = 'B' 
    uint16 = 'H' 

    data = struct.pack(uint16 * len(data), 
         *struct.unpack(uint8 * len(data), data)) 
추가

는 '>'또는 '<', 당신은 당신의 16 비트 스트림은 리틀 엔디안 또는 빅 엔디안인지 여부를 제어 할 수있는 것, 즉

data = struct.pack('>' + uint16 * len(data), 
         *struct.unpack(uint8 * len(data), data)) 

는 빅 엔디안 만들 것입니다.

관련 문제