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
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
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
@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