使用PIL保存动画GIF(保存的图像不动画)(Saving animated GIFs using PIL (image saved does not animate))

我有Apache2 + PIL + Django + X-sendfile。 我的问题是,当我保存动画GIF时,当我通过浏览器输出时,它不会“动画”。

这是我的代码,用于显示位于公共可访问目录之外的图像。

def raw(request,uuid): target = str(uuid).split('.')[:-1][0] image = Uploads.objects.get(uuid=target) path = image.path filepath = os.path.join(path,"%s.%s" % (image.uuid,image.ext)) response = HttpResponse(mimetype=mimetypes.guess_type(filepath)) response['Content-Disposition']='filename="%s"'\ %smart_str(image.filename) response["X-Sendfile"] = filepath response['Content-length'] = os.stat(filepath).st_size return response

UPDATE

事实证明它有效。 我的问题是当我尝试通过URL上传图像时。 它可能无法保存整个GIF?

def handle_url_file(request): """ Open a file from a URL. Split the file to get the filename and extension. Generate a random uuid using rand1() Then save the file. Return the UUID when successful. """ try: file = urllib.urlopen(request.POST['url']) randname = rand1(settings.RANDOM_ID_LENGTH) newfilename = request.POST['url'].split('/')[-1] ext = str(newfilename.split('.')[-1]).lower() im = cStringIO.StringIO(file.read()) # constructs a StringIO holding the image img = Image.open(im) filehash = checkhash(im) image = Uploads.objects.get(filehash=filehash) uuid = image.uuid return "%s" % (uuid) except Uploads.DoesNotExist: img.save(os.path.join(settings.UPLOAD_DIRECTORY,(("%s.%s")%(randname,ext)))) del img filesize = os.stat(os.path.join(settings.UPLOAD_DIRECTORY,(("%s.%s")%(randname,ext)))).st_size upload = Uploads( ip = request.META['REMOTE_ADDR'], filename = newfilename, uuid = randname, ext = ext, path = settings.UPLOAD_DIRECTORY, views = 1, bandwidth = filesize, source = request.POST['url'], size = filesize, filehash = filehash, ) upload.save() #return uuid return "%s" % (upload.uuid) except IOError, e: raise e

有任何想法吗?

谢谢!

Wenbert

I have Apache2 + PIL + Django + X-sendfile. My problem is that when I save an animated GIF, it won't "animate" when I output through the browser.

Here is my code to display the image located outside the public accessible directory.

def raw(request,uuid): target = str(uuid).split('.')[:-1][0] image = Uploads.objects.get(uuid=target) path = image.path filepath = os.path.join(path,"%s.%s" % (image.uuid,image.ext)) response = HttpResponse(mimetype=mimetypes.guess_type(filepath)) response['Content-Disposition']='filename="%s"'\ %smart_str(image.filename) response["X-Sendfile"] = filepath response['Content-length'] = os.stat(filepath).st_size return response

UPDATE

It turns out that it works. My problem is when I try to upload an image via URL. It probably doesn't save the entire GIF?

def handle_url_file(request): """ Open a file from a URL. Split the file to get the filename and extension. Generate a random uuid using rand1() Then save the file. Return the UUID when successful. """ try: file = urllib.urlopen(request.POST['url']) randname = rand1(settings.RANDOM_ID_LENGTH) newfilename = request.POST['url'].split('/')[-1] ext = str(newfilename.split('.')[-1]).lower() im = cStringIO.StringIO(file.read()) # constructs a StringIO holding the image img = Image.open(im) filehash = checkhash(im) image = Uploads.objects.get(filehash=filehash) uuid = image.uuid return "%s" % (uuid) except Uploads.DoesNotExist: img.save(os.path.join(settings.UPLOAD_DIRECTORY,(("%s.%s")%(randname,ext)))) del img filesize = os.stat(os.path.join(settings.UPLOAD_DIRECTORY,(("%s.%s")%(randname,ext)))).st_size upload = Uploads( ip = request.META['REMOTE_ADDR'], filename = newfilename, uuid = randname, ext = ext, path = settings.UPLOAD_DIRECTORY, views = 1, bandwidth = filesize, source = request.POST['url'], size = filesize, filehash = filehash, ) upload.save() #return uuid return "%s" % (upload.uuid) except IOError, e: raise e

Any ideas?

Thanks!

Wenbert

最满意答案

Image类来自何处以及Image.open是什么?

我的猜测是它对图像数据进行了一些消毒(这是一件好事),但只保存了Gif的第一帧。

编辑:

我确信这是PIL的一个问题。 关于GIF的PIL文档说:

PIL读取GIF87a和GIF89a版本的GIF文件格式。 该库写入了行程编码的GIF87a文件。

要验证,您可以将im的内容直接写入磁盘并与源映像进行比较。

Where does that Image class come from and what does Image.open do?

My guess is that it does some sanitizing of the image data (which is a good thing), but does only save the first frame of the Gif.

Edit:

I'm convinced this is an issue with PIL. The PIL documentation on GIF says:

PIL reads GIF87a and GIF89a versions of the GIF file format. The library writes run-length encoded GIF87a files.

To verify, you can write the contents of im directly to disk and compare with the source image.

更多推荐