2017-05-17 6 views
0

필자는 PIL을 실험하고 특정 문자열에서 이미지를 생성하고 있습니다.PIL을 사용하면 b/w 이미지의 비트가있는 문자열을 어떻게 표현할 수 있습니까?

는이 코드가이 코드에 오류가 없습니다

from __future__ import unicode_literals 

import array 
from PIL import Image 

photo_data = "35c1f6ebc3ef2d424ced351b65be8c396f8396d69411d7e7185f2a5e9eaab7da" 

scale = 16 ## equals to hexadecimal 
num_of_bits = 8 
allbits = [] 
for i in range(len(photo_data)): 
    photobits = bin(int(photo_data[i], scale))[2:].zfill(num_of_bits) 
    allbits.append(photobits) 

photo_image = Image.frombytes("1", (8, 64), "".join(allbits).replace("1","F"), "raw") 

photo_image.show() 

을하지만, 내가 볼 이미지가 바로 나에게 보이지 않는다.

enter image description here

나는 맨 윗줄은 '00000011'로 기대하지만 그것은 아마도 frombytes 함수의 매개 변수에 뭔가 '11001111'

입니다. 근데 뭐? : D

실제로 내가하려는 것은 photo_data 문자열의 각 문자를 이미지의 한 줄로 표시하고 각 활성화 된 비트는 검정색으로 표시합니다.

어쩌면 내가 잘못된 방향으로 가고있어 훨씬 쉬운 방법이 있을까요?

답변

0

지금 가지고있는 것은 ASCII 문자 "0"과 "F"의 이진 시각화를 나타내는 일련의 행입니다. 그 이유는 이것이 목록에 들어 있기 때문입니다. "0"은 00110000이고 "F"는 01000110입니다. 행과 일치합니다. 흰색은 1 비트이고 검은 색은 0 비트입니다.

지금은 각 픽셀을 단일 바이트 크기 문자로 나타내려고합니다. 그러나 frombytes은 실제로 비트 당 1 픽셀을 기대합니다. 즉 단일 문자가 8 픽셀을 나타냅니다. 그래서 당신이해야 할 일은 서수 값이 사진 데이터 문자열의 값과 같은 문자로 배열을 채우는 것입니다. 예를 들어 "d"는 "13"또는 "00001101"이 아니라 13 번째 ASCII 문자 "\ r"로 변환되어야합니다. int로 변환 한 후 chr으로 문자열로 다시 변환하면이 변환을 상당히 쉽게 수행 할 수 있습니다.

import struct 
from PIL import Image 

s = "35c1f6ebc3ef2d424ced351b65be8c396f8396d69411d7e7185f2a5e9eaab7da" 
bits = [chr(int(c,16)) for c in s] 
photo_image = Image.frombytes("1", (8, 64), "".join(bits), "raw") 
photo_image.show() 

결과 :

enter image description here

당신이 흰색 선호과 검은 색 1에 해당하는 0 대신 그 반대의, 당신은 b11111111 함께 XOR 연산하여 정수 값을 반전 할 수 있습니다.

bits = [chr(0xFF^int(c,16)) for c in s] 

결과 :

enter image description here