2017-09-01 46 views
-2

我想用PIL調整python中的圖像大小。 但我覺得它需要70毫秒的PIL。 原始圖像是1080 * 1920,我想將其更改爲500 * 500。 你能告訴我如何快速做出這個改變?如何在1ms內用PIL調整一幅圖像的大小?

這裏是我的代碼

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

這非常寬泛。我建議添加更多關於您的基準測試,需求和整個任務的信息,因爲這涉及到很多複雜的內容,包括延遲與帶寬等等。 – sascha

+0

也許很清楚。 – Beili

+0

所以你不想從更有經驗的用戶那裏獲得幫助嗎? – sascha

回答

0

隨着你得到了一個1920×1080像素的圖片通常的1920 * 1080 * 3整數與。調整大小最簡單的算法是延伸每個單獨的像素或丟棄像素。

因此,爲了拉伸圖片,您仍然需要訪問幾乎所有的像素,爲您留下超過一百萬次的訪問次數,併爲結果圖片留下更多的餘額(取決於調整大小的分辨率可能更多,也許更少)。

即使靠近硬件操作,達到1毫秒的速度也會非常快。 Python通常比其他編程語言慢得多,因爲速度不是它的主要關注點。

所以你最好的選擇是尋找一個所有C庫來完成這項工作,並將它封裝在python中。


編輯:

好吧,圖書館是非常接近確實如此。

只需使用過濾器Image.NEAREST調整圖片大小。例如:

img = Image.open("the picture") 
w = 500 
h = 500 

img = img.resize((w,h),Image.NEAREST) 

這顯然會是醜陋的,如果你伸展圖片太大(如過濾機制是最原始的),但它的速度快:從1920 * 1080 500 * 500,我花了2.4毫秒

+0

內部PIL和其他所有好的python-lib將在C/C++中完成。 python參數不在這裏。 – sascha

+0

你能給我一些關於C庫的建議嗎? – Beili

+0

@Beili:不。圖書館的推薦在這裏不合適。做你自己的研究。 –

-1

我已經做了一些大量的這方面的工作。長話短說,Python和PIL在1ms內速度不夠快。嘗試使用轉到與夢幻般的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) 
    } 
} 
+0

你可以舉一個例子 – Beili

+0

這是對問題的評論,而不是回答。答案是自持的,在這裏有相關的信息。場外鏈接應該只是額外的資源,但如果場外場所不可用,答案應該仍然有用。這個答案不符合這些標準。 –

-3

使用Python調整大小的圖像庫:

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 
+0

但它需要70ms – Beili

+0

看看這個鏈接https://blog.uploadcare。com/the-faster-production-ready-image-resize-out-there-part-0-7c974d520ad9 –

+0

博客URL不正確 – Beili

相關問題