如何用PIL在1ms内调整一个图像的大小?

时间:2017-09-01 02:38:36

标签: python image

我想用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

3 个答案:

答案 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