2009-09-18 33 views
10

我有python代碼,需要做一些簡單的事情來拍照:裁剪,調整大小,並覆蓋水印。我使用過PIL,並且resample/resize結果是TERRIBLE。我使用過imagemagick,界面和命令是通過將一隻貓包裝在一個盒子中,然後反覆將它扔到鍵盤上的一組樓梯上來設計的。Python成像替代

我正在尋找不是PIL或Imagemagick的東西,我可以使用python來執行簡單的高質量圖像轉換。對於這個問題,如果命令行界面很好,甚至不需要使用python綁定。

哦,它需要相對平臺不可知論,我們的生產服務器是Linux,但我們的一些開發人員在Windows上開發。它不需要安裝一堆愚蠢的gui代碼來作爲一個庫來使用。

+1

你會看起來有一段時間。除了PIL,PyMagick是唯一的東西。 – 2009-09-18 00:14:01

+3

人們如何找到PIL可以接受?即使使用ANTIALIAS重採樣設置,任何調整大小操作(甚至降採樣)都會產生僞影和模糊。我已經嘗試了幾個小時來讓它產生我接受的結果,但與桌面工具(如Photoshop或GIMP)相比,PIL的調整大小是可悲的。 – 2009-09-18 00:19:25

+1

我使用resalize和antialias來生成文檔生成應用程序的縮略圖,它們與acrobat pdf viewer的功能相似 – 2009-09-18 04:17:33

回答

17

我已經使用了PIL,並且resample/resize結果是TERRIBLE。

他們不應該,只要你:

  1. 只使用Image.ANTIALIAS濾波縮減操作
  2. 只使用Image.BICUBIC濾波倍增操作。
  3. 如果您正在使用調色板圖像,請記住在調整大小之前將其轉換爲「RGB」色彩模式
  4. 不要使用.thumbnail()。這是廢話
  5. 保存JPEG文件時quality=級別設置爲合適的東西(默認值是相當低的)
+0

你知道,經過一些進一步的測試,結果*與縮略圖相比在調整大小方面更好,即使兩者都使用Image.ANTIALIAS算法。如果我以後想到它,我會發布一些各種操作的示例結果。 – 2009-09-18 02:38:24

+1

請參閱http://stackoverflow.com/questions/1386400/pil-image-resizing-algorithm-similar-to-firefoxs-它不完全像測試一樣,但顯然有什麼相當錯誤的是thumbnail()是什麼這樣做。 – bobince 2009-09-18 11:02:35

+0

只是想加強點5.很容易錯過,這是這個問題最初抱怨的問題的主要原因。 – 2011-05-30 21:20:46

1

PIL可以做很好的調整大小。確保源圖像處於RGB模式,而不是調色板顏色,並嘗試不同的算法選擇。

+0

我一直使用普通的ol JPEG。 Image.open('myfile.jpg'),然後是Image.thumbnail或Image.resize,然後是Image.save ...所有的ANTIALIAS設置都是下采樣。這應該是RGB模式默認(jpegs是RGB)和最佳的下采樣算法,對嗎?如果我錯過了一些東西,我很想知道我錯了什麼...... – 2009-09-18 00:28:57

+0

沒有看到源代碼和源圖片,很難說出發生了什麼。許多人使用PIL進行這種工作,並對結果感到滿意。你的情況有些不同(你有特別的鷹眼嗎?),但我們還沒有弄清楚什麼。 – 2009-09-18 01:05:39

1

雖然imagemagick似乎是事實上的開源圖像庫,可能DevIL(跨平臺,似乎做簡單的圖像操作)或FreeImage

1

你檢查pypi?粗略的搜索顯示了一些與圖像相關的工具,我也發現了python-gd,不知道它可能有多有用。

我從來沒有與PIL自己的任何問題,但某種種類可能會有趣。

1

GIMP有一個合理的命令行界面,我認爲。

+0

不幸的是,GIMP需要GTK +,這是一個相當愚蠢的庫,已安裝在無頭服務器上。 – 2010-01-21 06:27:45

1

看看一些影像庫:

hxxp://pypi.python.org/pypi/collective.croppingimagefield/0.1beta

hxxp://pypi.python.org/ pypi/cropresize/0.1.1

hxxp://pypi.python.org/pypi/image_resize/1。0

0

我上次相比,該downscaler的輸出幾乎相同,GIMP的「立方」選項的:

import Image 

def stretch(im, size, filter=Image.NEAREST): 
    im.load() 
    im = im._new(im.im.stretch(size, filter)) 
    return im 

IIRC,差異是視覺上不可區分 - 一些像素值+/- 1由於四捨五入,他們往往是在邊緣。它也不慢。

CF:http://www.mail-archive.com/[email protected]/msg00248.html

2

我不能確定,爲什麼Image.thumbnail越來越這種高射炮。在目前的版本中,我只是從中找出想要的大小並調整圖像大小。只要你使用適當的重採樣過濾器,並首先轉換爲RGB(如bobince所說)縮略圖不應該與調整大小不同。

下面是縮略圖方法的實際來源:

def thumbnail(self, size, resample=NEAREST): 
    # preserve aspect ratio 
    x, y = self.size 
    if x > size[0]: y = max(y * size[0]/x, 1); x = size[0] 
    if y > size[1]: x = max(x * size[1]/y, 1); y = size[1] 
    size = x, y 

    if size == self.size: 
     return 

    self.draft(None, size) 

    self.load() 

    try: 
     im = self.resize(size, resample) 
    except ValueError: 
     if resample != ANTIALIAS: 
      raise 
     im = self.resize(size, NEAREST) # fallback 

    self.im = im.im 
    self.mode = im.mode 
    self.size = size 

    self.readonly = 0 
0

我用PIL,和重採樣/調整的結果是可怕的。

在PIL中調整大小已被多方面打破,並且PIL長時間不被維護。從Pillow 2.7開始,大部分問題都會得到解決,同時顯着提高性能。確保您使用latest Pillow