2011-12-13 3 views
1

방금 ​​장고와 파이썬을 사용하기 시작했고 사진 앱을 만들려고합니다. 이 스크립트는 미리보기 이미지를 생성하고 있으며 직접 작성하고 싶습니다. 불행히도 StringIO() 님은 무엇을하고 있는지 이해가되지 않습니다. 이 경우 Python Docs는별로 도움이되지 않습니다.이 스크립트에서 사용 된 StringIO()는 무엇입니까?

이 특별한 경우에 누군가 StringIO()에 대해 설명해 줄 수 있습니까? http://djangosnippets.org/snippets/1172/에서

:

def save(self): 
    from PIL import Image 
    #Original photo 
    imgFile = Image.open(self.image.path) 

    #Convert to RGB 
    if imgFile.mode not in ('L', 'RGB'): 
     imgFile = imgFile.convert('RGB') 

    #Save a thumbnail for each of the given dimensions 
    #The IMAGE_SIZES looks like: 
    #IMAGE_SIZES = { 'image_web'  : (300, 348), 
    #    'image_large' : (600, 450), 
    #    'image_thumb' : (200, 200) } 
    #each of which corresponds to an ImageField of the same name 
    for field_name, size in self.IMAGE_SIZES.iteritems(): 
     field = getattr(self, field_name) 
     working = imgFile.copy() 
     working.thumbnail(size, Image.ANTIALIAS) 
     fp = StringIO() 
     working.save(fp, "JPEG", quality=95) 
     cf = ContentFile(fp.getvalue()) 
     field.save(name=self.image.name, content=cf, save=False); 

    #Save instance of Photo 
    super(Photo, self).save() 
+0

앞으로는 질문에 코드를 게시하십시오. StackOverflow를 사용하면 쉽게 읽을 수 있습니다. – cheeken

+1

'StringIO'는 (보통 파일 시스템을 사용하는'open'로 생성 된 보통 파일과는 대조적으로) 메모리 내 파일을 생성하므로 기본적으로 메모리에서 파일 작업을 수행합니다. – birryree

답변

2

StringIO은 파일과 유사한 객체로 사용할 수있는 클래스입니다. 디스크에 기록되는 데이터 대신 메모리의 버퍼 (문자열 버퍼)에 쓰여지는 것을 제외하고는 일반 파일처럼 정확하게 사용할 수 있습니다.

이 스크립트에서는 이미지가 먼저 StringIO 메모리 버퍼에 저장된 것처럼 보입니다. 그런 다음 문자열 값이 검색되어 ContentFile의 생성자로 전달되어 ContentFile의 새 인스턴스를 만든 다음 전달됩니다 필드 저장 기능.

스크립트가 StringIO를 사용하는 이유는 ContentFile의 생성자가 문자열을 사용하고 StringIO 파일을 읽고 쓰는 것이 문자열로 표시된 이미지 내용을 가져 오는 가장 쉬운 방법이라고 생각합니다.

보조 노트로 Django's ImageFile 필드 유형을 살펴 보았습니다. 내 이미지 관련 요구 사항 이상으로 충분했으며 StringIO 및 ContentFiles를 통과하는 것보다 더 명확합니다.

+0

고마워, 내가 지금 생각 해냈다 :) 실제로 이미지 필드를 사용하려고하지만 모델을 저장하는 동안 이미지를 가져오고 크기를 조정하고 넣기를 원한다. 썸네일로서의 제 2 이미지 필드로 변환한다. – JasonTS

0

StringIO 읽고 하나는 파일에 쓸 것처럼 문자열에 기록 할 수있는 기능을 제공합니다. 이렇게하면 코딩을보다 편리하게, 더 쉽게 또는 둘 다 수행 할 수 있습니다.

또한 일반 파이썬 문자열과 달리 문자열을 편집 할 수 있습니다.

+0

설명서에서 알 수 있겠지만 왜 여기에 사용됩니까? 나는 개념을 전혀 얻지 못한다. 실제로 fp에 저장된 것은 무엇입니까? 경로 또는 바이너리 파일? 왜 stringio 대신 여기에 일반 문자열 대신 사용됩니까? – JasonTS

+0

@user : 이미지가 저장됩니다. 그러나 파일에 저장되지는 ​​않지만 문자열 IO로 저장됩니다. 즉, stringIO를 저장하라는 호출 후에 이미지의 내용이 포함됩니다. 작성자가 문자열을 사용하지 않은 이유는 a) 문자열에 쓸 수 없다는 것 (문자열은 읽기 전용 임)이므로 save 메소드가 이미지의 내용을 문자열 인수로 쓸 수있는 방법이 없으며 b) save가 첫 번째 인수로 문자열을 얻으면 파일 이름으로 해석합니다. – sepp2k

+0

@JasonTS : 일반 파이썬 문자열과 달리 문자열에 원하는대로 할 수있는 버퍼로 유용합니다. – bcc32

관련 문제