通过URL打开图片并在Python中检测其是否为png、jpg或gif?
我想知道一个来自puush.me的图片(链接只是图片,没有HTML内容)是png、jpg还是gif格式。有没有办法在Python中做到这一点?urllib似乎无法打开图片,也无法检测它们的格式。
4 个回答
-2
在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。比如说,有人可能在使用一个叫做“库”的东西时,发现它的某些功能没有按照预期工作。这种情况可能会让人感到困惑,因为我们可能不知道问题出在哪里。
通常,解决这类问题的第一步是仔细检查代码,看看有没有写错的地方。接着,可以查阅相关的文档,看看这个库的使用说明是否有遗漏的部分。很多时候,文档里会有一些示例代码,帮助我们理解如何正确使用这些功能。
如果自己解决不了,还可以去一些技术论坛,比如StackOverflow,向其他人请教。在提问的时候,最好把自己的代码和遇到的问题描述清楚,这样别人才能更好地帮助你。
总之,遇到问题时不要着急,慢慢分析,查阅资料,必要时寻求帮助,通常都能找到解决办法。
import os
def get_extension(image_url):
_, extension = os.path.splitext(image_url)
return extension
image_url = "https://example.com/images/my_image.jpg"
print(get_extension(image_url)) # Output: .jpg
1
如果你有文件的数据,可以查看文件开头的几个字节,看看有没有特定的“魔数”标识:
- png格式的文件开头是 89 50 4E 47 0D 0A 1A 0A
- jpg格式的文件开头是 FF D8 FF
- bmp格式的文件开头是 42 4D
- gif格式的文件开头是 47 49 46 38
比如,使用Python3.x可以这样做:
with open('image', 'rb') as f:
bytes = f.read()
if bytes.startswith(b'89504E470D0A1A0A'):
print('PNG')
if bytes.startswith(b'FFD8FF'):
print('JPG')
if bytes.startswith(b'424D'):
print('BMP')
if bytes.startswith(b'47494638'):
print('GIF')
2
你可以使用 imghdr 这个库(它是Python标准库的一部分)来判断一张图片的类型。
import cStringIO
import imghdr
import urllib2
url = "http://www.gnu.org/graphics/gerwinski-gnu-head.png"
response = urllib2.urlopen(url)
data = cStringIO.StringIO(response.read())
print(imghdr.what(data))
3
在下载文件之前,如果想知道这个文件是什么类型,可以查看网络服务器发送的 Content-Type
头信息。
下面是一个 Python 2.x 的例子:
import urllib2
my_url = "http://upload.wikimedia.org/wikipedia/en/b/bc/Wiki.png" #example image
request = urllib2.urlopen(my_url)
mime = request.info()['Content-type']
if mime.endswith("png"):
print("Image is a png")
elif mime.endswith("jpeg"):
print("Image is a jpg")
elif mime.endswith("gif"):
print("Image is a gif")
#Image is a png