我想用PIL在python中调整图像大小。 但我发现PIL需要70毫秒。 原始图像是1080 * 1920,我想将其更改为500 * 500。 你能告诉我如何快速做出改变吗?
这是我的代码
from PIL import Image
img = Image.open('/your iamge path/image.jpg')
import time
start=time.clock()
img = img.resize((500, 500), Image.ANTIALIAS)
end =time.clock()
print end-start
答案 0 :(得分:0)
使用1920 * 1080像素图像,您可以使用通常的1920 * 1080 * 3整数。调整大小的最简单算法是拉伸每个像素或丢弃像素。
因此,要拉伸图片,您仍然需要访问几乎每个像素,为您留下超过一百万次访问,并为生成的图片再增加一百万(取决于调整大小的分辨率可能更多,可能更少)
即使您靠近硬件操作,达到1毫秒也会非常快。 Python通常比其他编程语言慢得多,因为速度并不是它的主要关注点。
所以你最好的选择是寻找一个完成这项工作并将其包装成python的所有C库。
编辑:
好的,图书馆确实非常接近。
使用过滤器Image.NEAREST调整图片大小。 E.g:
img = Image.open("the picture")
w = 500
h = 500
img = img.resize((w,h),Image.NEAREST)
如果你将图片拉得太多(因为过滤机制是最原始的),这显然会很难看,但速度很快:从1920 * 1080到500 * 500,它花了我2.4毫秒
答案 1 :(得分:-1)
我在这方面做了大量工作。简而言之,Python和PIL在1ms内不会足够快。尝试使用Go以及精彩的Govips图书馆https://github.com/davidbyttow/govips
来自https://github.com/davidbyttow/govips/blob/master/examples/resize/resize.go的示例:
package main
import (
"flag"
"fmt"
"os"
"github.com/davidbyttow/govips"
)
func run(inputFile, outputFile string) error {
in, err := govips.NewImageFromFile(inputFile,
govips.NewOptions().SetInt("access", int(govips.AccessSequential)))
if err != nil {
return err
}
interp, err := govips.NewInterpolator("nohalo")
if err != nil {
return err
}
out := in.ResizeEx(0.2, govips.NewOptions().SetInterpolator("interpolate", interp))
out.WriteToFile(outputFile, nil)
return nil
}
var (
flagIn = flag.String("in", "", "file to load")
flagOut = flag.String("out", "", "file to write out")
)
func main() {
flag.Usage = func() {
fmt.Fprintf(os.Stderr, "resize -in input_file -out output_file")
}
flag.Parse()
govips.Startup(nil)
defer govips.Shutdown()
err := run(*flagIn, *flagOut)
if err != nil {
os.Exit(1)
}
}
答案 2 :(得分:-3)
使用python-resize-image库:
from PIL import Image
img = Image.open('/your iamge path/image.jpg') # image extension *.png,*.jpg
new_width = 500
new_height = 500
img = img.resize((new_width, new_height), Image.ANTIALIAS)
img.save('output image name.png') # format may what u want ,*.png,*jpg,*.gif