2014-06-06 5 views
4

필로우 2.4.0이 설치되어 있습니다 (OS X 및 Ubuntu 14.04 EC2의 가상 환경 모두). 파형의 시각화를 생성하기 위해 다음 스크립트를 작성했습니다 (drawing some inspiration from Jiaaro). Pydub 라이브러리를 사용하여 파형을 분석하고 PIL/Pillow의 ImageDraw 기능을 사용하여 선을 그립니다. WAV 변수합니다 (Pydub 라이브러리)을 audiosegment()는, imgname은 문자열입니다PIL/베일 반전 투명도가 겉보기 임의로

def draw_waveform(wav, imgname, color="#000000", w=400, h=40): 
    sound = wav 
    name = imgname 
    width = w 
    height = h 
    color = color 

    chunk_length = len(sound)/width 

    loudness_of_chunks = [ 
     sound[ i*chunk_length : (i+1)*chunk_length ].rms 
     for i in range(width)] 

    max_rms = max(loudness_of_chunks) 
    scale = max_rms/(height/2) 

    size = (width,height) 
    im = Image.new('RGBA', size, (255, 255, 255, 255)) 

    draw = ImageDraw.Draw(im) 

    for i in range(1, width): 
     pos = (width - i, height/2 + loudness_of_chunks[i]/scale-4) 
     draw.line((width - i,height/2) + pos, fill=color) 
     pos = (width - i, height/2 - loudness_of_chunks[i]/scale+4) 
     draw.line((width - i,height/2) + pos, fill=color) 

    del draw 

    im.rotate(180).save(app.config['UPLOAD_FOLDER'] + '/' + name, 'GIF', transparency=0) #, transparency=0 

    return app.config['UPLOAD_FOLDER'] + '/' + name 

모두의 그루비, 대부분의 시간. 일부 파형의 경우, 특히 피크에 가까운 PIL은 투명도를 뒤집은 GIF를 출력합니다. 파형은 투명 해지고 주변의 공간은 흰색이됩니다. 일반적으로 배경은 투명하고 파형은 검은 색 (# 000000)입니다. 여기

가 예상되는 출력의 사진입니다 :

Correct output

그리고 잘못된 (오른쪽 저장-로 열린 이미지 편집기에서, 그 배경이 흰색이며 가운데가 투명으로 클릭) :

Incorrect output

는 사람이 비슷한 문제를 경험 한 적이 있습니까? 명백한 것 (아마도)을 놓치고 있습니까?

+0

''RGBA ''대신''P'' 이미지 형식을 사용하고''save''에 투명한 색인을 설정해보십시오. . http://pillow.readthedocs.org/en/latest/handbook/image-file-formats.html#gif –

+0

쉬운 해킹 : 완전히 검은 색 레이어를 만들고 그 위에 현재 출력을 오버레이 할 수 있습니다. 그래도 그 질문에 대한 답은 모르겠다.) – Jiaaro

+0

@Jiaaro - 불행히도 내가 보여주고있는 테이블에 투명성이 필요하다. 우연히, 당신의 훌륭한 라이브러리 (24 비트 지원을 추가하면 많은 선물을 보내 드리겠습니다;)) – lyell

답변

2

이것은 내가 상상했던 것보다 (놀람 놀랍게도) 간단합니다. 영감을 얻으 려던 @MarkRansom에게 감사드립니다.

color=0 

(가) 전화를 저장할 수 있는지 확인합니다 (0, 블랙에 대한) 색상을 정의

im = Image.new('P', size, 255) 

, 오히려 'RGBA'보다 'P'로 이미지를 인스턴스화 흰색을 정의 검정색이 아닌 투명도 영역 :

im.save(name, 'GIF', transparency=255) 

S 조금만 궁금해 질 때까지 원래의 코드로 시간이 좀 걸릴 것입니다 ...

+0

마지막으로 당신이 쓴 2 년 반 후에 답을 보았습니다. 일부 시간에만 실패한 이유는 팔레트가 이미지의 색상을 기반으로 처음부터 다시 만들어지기 때문에 적합하다는 것입니다. 거의 완전 무작위로 색이 인덱스 0에서 끝납니다. –