2012-04-22 34 views
14

Tôi cố gắng để chuyển đổi một gif hình ảnh duy nhất với Python Image Library, nhưng nó kết quả trong khung lạPIL - Chuyển đổi Frames GIF để JPG

Các gif Input là:

Source Image http://longcat.de/gif_example.gif

Trong lần thử đầu tiên của tôi, tôi đã cố gắng chuyển đổi hình ảnh bằng Image.new thành hình ảnh RGB , với 255,255,255 làm nền trắng - giống như bất kỳ ví dụ nào khác tôi đã tìm thấy trên internet:

def processImage(infile): 

    try: 
     im = Image.open(infile) 
    except IOError: 
     print "Cant load", infile 
     sys.exit(1) 

    i = 0 

    try: 
     while 1: 

      background = Image.new("RGB", im.size, (255, 255, 255)) 
      background.paste(im) 
      background.save('foo'+str(i)+'.jpg', 'JPEG', quality=80) 

      i += 1 
      im.seek(im.tell() + 1) 

    except EOFError: 
     pass # end of sequence 

nhưng nó kết quả trong các tập tin đầu ra lạ:

Example #1 http://longcat.de/gif_example1.jpg

thử thứ hai của tôi là, để chuyển đổi gif trong một RGBA đầu tiên, và sau đó sử dụng mặt nạ trong suốt của nó, để làm cho các mảnh màu trắng trong suốt:

def processImage(infile): 

    try: 
     im = Image.open(infile) 
    except IOError: 
     print "Cant load", infile 
     sys.exit(1) 

    i = 0 

    try: 
     while 1: 

      im2 = im.convert('RGBA') 
      im2.load() 

      background = Image.new("RGB", im2.size, (255, 255, 255)) 
      background.paste(im2, mask = im2.split()[3]) 
      background.save('foo'+str(i)+'.jpg', 'JPEG', quality=80) 

      i += 1 
      im.seek(im.tell() + 1) 

    except EOFError: 
     pass # end of sequence 

mà kết quả trong một đầu ra như thế này:

Example #2 http://longcat.de/gif_example2.jpg

Ưu điểm so với lần thử đầu tiên là, rằng frame đầu tiên trông khá tốt Nhưng khi bạn có thể thấy, phần còn lại được chia

gì tôi nên thử tiếp theo?

Edit:

Tôi nghĩ rằng tôi đến gần hơn rất nhiều với các giải pháp

Example #3 http://longcat.de/gif_example3.png

tôi đã phải sử dụng bảng của hình ảnh đầu tiên cho những hình ảnh khác, và hợp nhất nó với khung hình trước (đối với hình động gif sử dụng hình ảnh khác)

def processImage(infile): 

    try: 
     im = Image.open(infile) 
    except IOError: 
     print "Cant load", infile 
     sys.exit(1) 

    i = 0 

    size  = im.size 
    lastframe = im.convert('RGBA') 
    mypalette = im.getpalette() 

    try: 
     while 1: 

      im2 = im.copy() 
      im2.putpalette(mypalette) 

      background = Image.new("RGB", size, (255,255,255)) 

      background.paste(lastframe) 
      background.paste(im2) 
      background.save('foo'+str(i)+'.png', 'PNG', quality=80) 

      lastframe = background 

      i += 1 
      im.seek(im.tell() + 1) 

    except EOFError: 
     pass # end of sequence 

Nhưng i ac không biết, tại sao độ trong suốt của tôi là màu đen, thay vì màu trắng Ngay cả khi tôi sửa đổi bảng màu (thay đổi kênh trong suốt thành màu trắng) hoặc sử dụng mặt nạ trong suốt, nền vẫn là màu đen

Trả lời

18

Trước hết, JPEG không hỗ trợ minh bạch! Nhưng đó không phải là vấn đề duy nhất ..Khi bạn di chuyển đến khung tiếp theo của thông tin GIF, thông tin palette bị mất (problem witn PIL?) - vì vậy PIL không thể chuyển đổi chính xác sang khung RGBA (Do đó khung đầu tiên là kén, nhưng tất cả các khung hình khác đều không hợp lệ). Vì vậy, công việc xung quanh là thêm palette trở lại cho mọi khung hình, (đó là những gì bạn đang làm trong ví dụ mã cuối cùng của mình, nhưng sự cố của bạn là bạn đã tiết kiệm được RGB không phải RGBA để bạn không có kênh alpha/trong suốt. Ngoài ra bạn đã làm một vài điều không cần thiết ..). Nhưng dù sao, đây là của .png với tính minh bạch và mã sửa chữa, hy vọng của một số sử dụng :)

enter image description hereenter image description hereenter image description hereenter image description hereenter image description hereenter image description hereenter image description hereenter image description hereenter image description hereenter image description here

import Image 
import sys 

def processImage(infile): 
    try: 
     im = Image.open(infile) 
    except IOError: 
     print "Cant load", infile 
     sys.exit(1) 
    i = 0 
    mypalette = im.getpalette() 

    try: 
     while 1: 
      im.putpalette(mypalette) 
      new_im = Image.new("RGBA", im.size) 
      new_im.paste(im) 
      new_im.save('foo'+str(i)+'.png') 

      i += 1 
      im.seek(im.tell() + 1) 

    except EOFError: 
     pass # end of sequence 

processImage('gif_example.gif') 
+0

Cảm ơn bạn rất nhiều! Tôi sử dụng dán với khung cuối cùng, bởi vì một số gifs sử dụng diffs cho mỗi khung hình – Schinken

+1

Uhm, thay thế bảng màu như thế sẽ cho kết quả không đúng khi các khung có các bảng màu khác nhau. đó là hình ảnh http://www.imagemagick.org/Usage/anim_opt/bunny_bgnd.gif (Tôi nghĩ, không chắc chắn liệu tôi đang sao chép và dán các liên kết phù hợp). Vấn đề khác tôi thấy có thể liên quan đến sự khác biệt giữa các phiên bản PIL, nhưng tôi không nhận được kết quả tương tự như của bạn (tôi nhận được các vùng màu xám trong tất cả các khung trừ khung đầu tiên, nơi cần phải minh bạch). Điều tương tự cũng xảy ra đối với gif như http://www.imagemagick.org/Usage/anim_opt/bunny_bgnd_opttrans.gif. – mmgp

+0

@mmgp - hmm, yep Tôi có thể thấy rằng các khung có các bảng màu khác nhau có thể gây ra sự cố. Tôi đồng ý rằng bạn nhận được các kết quả khác nhau có thể là vấn đề về phiên bản. Thật không may, tôi không có thời gian để xem xét điều này tại thời điểm này, nếu bạn có một sửa chữa xin vui lòng chỉnh sửa câu trả lời của tôi, hoặc thêm bạn sở hữu. tốt đẹp nhất. – fraxel

4

Khi xem hình ảnh trên trình xem hình ảnh, ngay cả khi độ trong suốt được đặt thành 0, nó có xu hướng hiển thị hình ảnh dưới dạng màu đen. Một cách để đảm bảo rằng hình ảnh của bạn thực sự trong suốt là hợp nhất nó với nhau. Các 'biểu tượng cảm xúc' nên được xem trong khi không cản trở việc image.Try khác:

background = Image.open('someimage.jpg') #an existing image 
foreground = Image.open('foo.jpg') #one of the above images 
background.paste(foreground, (0,0), foreground) 
background.save('trial.jpg') #the composite image 

Về mặt lý thuyết, nếu bạn mở 'trial.jpg' trong trình xem hình ảnh và nội dung của hình ảnh ban đầu được bảo tồn và trên nó nằm hình ảnh foo sau đó bạn sẽ biết chắc chắn nếu nó chỉ là người xem hình ảnh và hình ảnh của bạn là tốt ...

+0

.jpeg không hỗ trợ minh bạch :( – fraxel

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