有没有一种方法,同时具有使其压缩GIF imageio的python?我用大约200张图片制作gif,最终文件是30MB.我更喜欢它是5-10 MB.无论如何,图像是单色的,所以应该可以压缩.有没有可以使用的工具或指定它imageio?
这是我制作gif的代码:
import os
import imageio as io
import re
#############################################################
#key to sort the file_names in order
numbers = re.compile(r'(\d+)')
def numericalSort(value):
parts = numbers.split(value)
parts[1::2] = map(int, parts[1::2])
return parts
############################################################
file_names = sorted((fn for fn in os.listdir('.') if fn.startswith('surface')), key = numericalSort)
#gif writer
with io.get_writer('python_growth.gif', mode='I', duration=0.1) as writer:
for filename in file_names:
image = io.imread(filename)
writer.append_data(image)
Run Code Online (Sandbox Code Playgroud) 我尝试在网上阅读了很多例子,发现imageio它是完美的包.还找到了这里写的例子.
我刚刚按照图示示例并尝试了以下操作
import imageio as io
import os
file_names = sorted((fn for fn in os.listdir('.') if fn.startswith('surface')))
#making animation
with io.get_writer('surface.gif', mode='I', duration=0.5) as writer:
for filename in file_names:
image = io.imread(filename)
writer.append_data(image)
writer.close()
Run Code Online (Sandbox Code Playgroud)
另一个例子.
images = []
for filename in file_names:
images.append(io.imread(filename))
io.mimsave('surface1.gif', images, duration = 0.5)
Run Code Online (Sandbox Code Playgroud)
这两个都行不通.基本上我只看到gif中的第一帧并且眨眼并完成.持续时间设置为0.5秒,所以它应该工作正常.我可能错过了这里的一些东西.
我正在尝试编写一个在Mac OS 10.11.16上使用MoviePy将Python文件转换为GIF的Python程序.我用:
import moviepy.editor as mp
Run Code Online (Sandbox Code Playgroud)
我得到一个错误,说我需要打电话,imageio.plugins.ffmpeg.download()所以我可以下载ffmpeg.我用:
import imageio
imageio.plugins.ffmpeg.download()
Run Code Online (Sandbox Code Playgroud)
这给了我以下错误:
Imageio: 'ffmpeg.osx' was not found on your computer; downloading it now.
Error while fetching file: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:749)>.
Error while fetching file: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:749)>.
Error while fetching file: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:749)>.
Error while fetching file: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:749)>.
Traceback (most recent call last):
File "<pyshell#2>", …Run Code Online (Sandbox Code Playgroud) 我get_reader()在一个上下文中的视频上使用ImageIO的功能,这样做的过程将被分叉.然后连续地对该读取器进行随机索引(使用该get_data方法).最终,我遇到了一个错误imageio.core.format.CannotReadFrameError: Could not read frame -1.如果进程未分叉,则不会发生此错误.ImageIO get_reader()不是叉安全吗?或者问题出在其他地方?
与 matplotlib.imshow() 相比,似乎 matplotlib.imsave() 使图像变亮。例如,看看下面的代码。
import imageio
import matplotlib.pyplot as plt
image = imageio.imread('image.jpg')
plt.imshow(image)
plt.imsave('image_new.jpg',image )
image_new = imageio.imread('image_new.jpg')
plt.imshow(image_new)
Run Code Online (Sandbox Code Playgroud)
保存的图像“image_new.jpg”(右)比“image.jpg”(左)略亮
图片来源:https ://c1.staticflickr.com/9/8191/8424182610_e23dcc6b4d_b.jpg
我的函数的工作流程如下:
这就是我所做的保存:
response = requests.get(urlstring, params=params)
if response.status_code == 200:
with open('PATH%d.png' % imagenumber, 'wb') as output:
output.write(response.content)
Run Code Online (Sandbox Code Playgroud)
这就是我将 png 加载并转换为 np.array 所做的事情
imagearray = im.imread('PATH%d.png' % imagenumber)
Run Code Online (Sandbox Code Playgroud)
由于我不需要永久存储我下载的内容,因此我尝试修改我的函数以便直接转换 Numpy 数组中的 response.content 。不幸的是,每个类似 imageio 的库都以相同的方式从磁盘读取 uri 并将其转换为 np.array。
我尝试了这个,但显然它不起作用,因为它需要输入 uri
response = requests.get(urlstring, params=params)
imagearray = im.imread(response.content))
Run Code Online (Sandbox Code Playgroud)
有什么办法可以克服这个问题吗?如何将我的response.content转换为np.array?
我正在python中使用一些图像,我正在尝试将一系列尺寸= 961x509的图像转换为MP4电影文件.我已经做了这个并且它正在工作但我有一个非常烦人的问题,警告说这样的事情:
警告:root:IMAGEIO FFMPEG_WRITER警告:输入图像不能被macro_block_size = 16整除,从(509L,961L)调整为(512L,976L)以确保与大多数编解码器和播放器的视频兼容性.要防止调整大小,请使输入图像可被macro_block_size整除,或将macro_block_size设置为None(存在不兼容的风险).由于数据未对齐,您可能还会看到有关速度损失的FFMPEG警告.[swscaler @ 04f8ac40]警告:数据未对齐!这可能导致速度损失
出现警告的问题是我的图像分辨率,该分辨率应该可以被2整除,但我的不是.是否有任何可能只是让这个警告不再出现?因为我无法改变图像的大小,同时我也不想调整所有图像的大小.
这是我的代码:
Run Code Online (Sandbox Code Playgroud)ready_images = [] for img in videos['Images']: image = imageio.imread(img.fileName) ready_images.append(image) videoName = videos['Images'][0].gifLocationPath + "//" + videos['Name'] imageio.mimwrite(videoName, ready_images, 'MP4')
这里有人对我有什么解决方案吗?
更新:
如果我要以这种方式将macro_block_size放到None(这是我知道的唯一方法):
ready_images = []
for img in videos['Images']:
image = imageio.imread(img.fileName)
ready_images.append(image)
video_name = videos['Images'][0].gifLocationPath + "//" + videos['Name']
imageio.mimwrite(video_name, ready_images, 'MP4', macro_block_size = None)
Run Code Online (Sandbox Code Playgroud)
我将收到此错误消息:
打开输出流#0的编码器时出错:0 - 可能是不正确的参数,如bit_rate,rate,width或height
回溯(最近一次调用最后一次):文件"",第146行,在run()文件"",第136行,在运行中为i,_在tqdm中(枚举(pool.imap_unordered(generateGIFsWithThreads,videoList))):文件" ",第953行,iter for obj in iterable:File"",第673行,在下一个提升值IOError:[Errno 32] Broken pipe
FFMPEG命令:ffmpeg -y -f rawvideo -vcodec rawvideo …
我正在用三个不同的库在 python 中读取图像
我使用这些库中的每一个读取图像的输出都不同。例如
关于使用 imageio 阅读
a = imageio.imread('test_img.png')
输出类型为 - uint8,大小为 (500,334,4)
使用图像
b = Image.open('test_img.png')
类型 - 图像、大小 (334,500)
使用 cv2
c = cv2.imread('test_img.png')
类型- uint8,大小(500,334,3)
为什么在使用三个不同的库时,同一图像会得到三个不同的大小?请帮助我理解差异。
我正在使用imageio和Python。它似乎比PIL和consorts具有更清洁的API,因此我想继续使用imageio而不是其他工具。
我知道如何获取图像大小:
height, width, channels = imageio.imread(filepath).shape
Run Code Online (Sandbox Code Playgroud)
有没有一种方法可以获取图像的大小,而无需将其完全加载到内存中?这应该是可能的,不是吗?至少对于一些格式(我想)在标题中具有图像大小?
python-imageio ×10
python ×8
ffmpeg ×2
animated-gif ×1
arrays ×1
gif ×1
image ×1
macos ×1
matplotlib ×1
moviepy ×1
mp4 ×1
numpy ×1
opencv ×1
python-3.x ×1
video ×1