2012-02-03 36 views
6

Tôi tự hỏi liệu có thể mở rộng hình ảnh GIF động bằng PIL hay không. Đặc biệt nguyên mẫu Plone của ImageField hiện mất hình ảnh động từ các hình ảnh thu nhỏ lại sử dụng phương pháp quy mô của nó:Làm thế nào để bạn chia tỷ lệ hình ảnh GIF động trong PIL và bảo toàn hoạt ảnh

def scale(self, data, w, h, default_format = 'PNG'): 
    """ scale image (with material from ImageTag_Hotfix)""" 
    #make sure we have valid int's 
    size = int(w), int(h) 

    original_file=StringIO(data) 
    image = PIL.Image.open(original_file) 
    # consider image mode when scaling 
    # source images can be mode '1','L,','P','RGB(A)' 
    # convert to greyscale or RGBA before scaling 
    # preserve palletted mode (but not pallette) 
    # for palletted-only image formats, e.g. GIF 
    # PNG compression is OK for RGBA thumbnails 
    original_mode = image.mode 
    img_format = image.format and image.format or default_format 
    if original_mode == '1': 
     image = image.convert('L') 
    elif original_mode == 'P': 
     image = image.convert('RGBA') 
    image.thumbnail(size, self.pil_resize_algo) 
    # decided to only preserve palletted mode 
    # for GIF, could also use image.format in ('GIF','PNG') 
    if original_mode == 'P' and img_format == 'GIF': 
     image = image.convert('P') 
    thumbnail_file = StringIO() 
    # quality parameter doesn't affect lossless formats 
    image.save(thumbnail_file, img_format, quality=self.pil_quality) 
    thumbnail_file.seek(0) 
    return thumbnail_file, img_format.lower() 

tôi biết làm thế nào để xác định một GIF động: Các đánh giá lại sau True image.format == 'GIF' and image.seek(image.tell()+1). Tôi đã cố gắng không chuyển đổi sang chế độ RGBA nhưng điều đó không hoạt động.

Nền: Trong trường hợp Plone của chúng tôi, chúng tôi đã sửa đổi loại hình ảnh mặc định để đặt thuộc tính original_size của trường hình ảnh để buộc tất cả hình ảnh được thu nhỏ với cài đặt chất lượng phù hợp. Điều này phù hợp với jpegs nhưng có nghĩa là chúng tôi hiện không thể tải lên các ảnh động GIF

+0

Chia tỷ lệ hình ảnh được tạo lưới có thể dẫn đến chất lượng hình ảnh không được chấp nhận. –

Trả lời

4

PIL có một số hỗ trợ giới hạn cho GIF động nhưng điều này có giới hạn và bạn phải làm việc ở mức rất thấp để xử lý .

Tôi khuyên bạn nên thử một số phương pháp khác để chia tỷ lệ hình ảnh so với PIL nếu bạn muốn xử lý ảnh động của gif. Có thể, cách đơn giản nhất là sử dụng ImageMagick ngoại tuyến, với subprocess.Popen - (và thậm chí sau đó, tại thời điểm này, tôi chỉ đoán ImageMagick "làm điều đúng" với GIF động) -

An tùy chọn là có một "máy chủ xử lý hình ảnh", với một tập lệnh Python khác, ngoài cài đặt zope của bạn sẽ nhận được yêu cầu chia tỷ lệ hình ảnh - có thể với cuộc gọi xmlrpc - bạn có thể tạo điều này dưới dạng trình cắm thêm GIMP và sử dụng GIMP cho mở rộng quy mô của GIF.

Một tùy chọn khác là để mọi thứ như cũ và sử dụng "ảnh tĩnh" cho GIF động nơi chúng cần xuất hiện ở một thứ nguyên khác so với ảnh gốc và hiển thị hình ảnh gốc nơi hoạt ảnh phù hợp. (Hoặc có thể chỉ cần yêu cầu ảnh động của gif được gửi đã có kích thước phù hợp)

+2

Cảm ơn. Tôi đã chỉnh sửa mã để nó không cố gắng mở rộng hình ảnh GIF động nếu hình ảnh nguồn không lớn hơn thang đo. Xem http://dev.plone.org/ticket/12488 – scarba05

+1

Tôi đã xem xét thêm PIL - nó thực sự có hỗ trợ đọc gifś nhiều khung hình, nhưng không hỗ trợ gì cả cho việc tạo hoặc viết chúng. – jsbueno

7

Bạn có thể sử dụng images2gif.py để đọc gif và hơn là chia tỷ lệ khung hình một cách độc lập. images2gif sẽ cho phép bạn viết một gif động với một chuỗi các hình ảnh.

images2gif.py Tôi tìm thấy trên internet không xử lý độ trong suốt, vì vậy tôi đã khắc phục điều đó. Bạn có thể thấy rằng ở đây: https://bitbucket.org/bench/images2gif.py

Các vấn đề liên quan