2012-02-20 89 views
1

我目前正在從命令行運行一個PHP應用程序來優化圖像文件夾。如何避免優化已經使用PHP優化的圖像?

PHP應用程序更像是其他Image Optimizer的包裝,它只是迭代目錄並抓取所有圖像,然後通過適當的程序運行圖像以獲得最佳效果。

下面是我將使用以及每個將用於...

imagemagick,以確定文件類型和轉換非動畫GIF的爲PNG
gifsicle優化Gif動畫程序圖像0​​ jpegtran優化JPG圖像0​​ pngcrush優化PNG圖像0​​ pngquant優化PNG圖像PNG8格式
pngout優化PNG圖像PNG8格式

我的問題:隨着1-10圖像,一切運行平穩,較快不過,有一次我在一個運行更大的文件夾10個或更多的圖像,它變得非常慢。我並沒有看到一個很好的解決方案,但有一點可以幫助您避免重新處理已經優化的圖像。因此,如果我有一個包含100個圖像的文件夾,並優化該文件夾,然後添加5個新圖像,請重新運行優化程序。然後它必須優化105個圖像,我的目標是讓它只優化5個較新的圖像,因爲之前的100個圖像已經被優化。當新圖像添加到圖像文件夾時,這樣做會大大提高性能。

我意識到簡單的解決方案將簡單地複製或移動到一個新的文件夾後處理它們,我的問題與簡單的解決方案是這些圖像用於網站和網站,所以圖像通常很難鏈接到一個網站的源代碼,改變圖像的路徑會使這個複雜化,並有可能打破它。

我的一些想法是:將某種文本文件數據庫寫入圖像文件夾,這些文件夾將列出所有已經處理的圖像,所以當應用程序運行時,它只會運行在不是已經在那個文件中。另一個想法是爲文件名命名以在名稱中具有某種標識以表明它已被優化,第三個想法是在優化後將每個優化文件移動到最終目標文件夾。想法2和3不好,因爲它們會打破網站源代碼中的所有圖像路徑鏈接。

所以,如果你能想到一個體面的/良好的解決方案這個問題,請分享?

回答

3

元數據
它經過優化後,你可以把一個標誌中的每個圖像的元信息。首先檢查該標誌,只有在不在時才進行。您可以使用exif_read_data()來讀取數據。寫它可能like this

以上是JPG圖片。 Metdata爲PNG格式,還可以看看this question,and this one

我不知道的GIF,但你可以肯定convert them to PNGs,然後添加元數據......雖然我敢肯定,他們有自己的元信息,因爲meta data extraction tools允許GIF格式。

數據庫支持
另一個解決方案是存儲有關在MySQL數據庫中的圖像信息。這樣,當您調整優化時,您可以隨時瞭解在哪個圖像上嘗試進行哪種優化。您可以根據您選擇的任何參數選擇要優化的圖像。你可以爲此建立一個管理面板。這種方法將允許簡單的實驗。

您還可以結合上述兩種方法。

最大文件大小
由於這是節省空間,你可以有計劃只對大於某一文件大小圖像的工作。理想情況下,運行一次壓縮器後,所有圖像都會低於此文件大小,之後只會觸及新添加的太大圖像。我不知道這在實現方面有多實用,因爲它要求壓縮器在某些任意文件大小下獲得任何圖像。您可以使最大文件大小取決於圖像大小.....

+0

這實際上是我的第一個想法,但我相信這隻會用於JPG圖像?大多數我的網站圖片都是png和gif,或者至少在大多數情況下都會轉換爲這些圖片,我認爲其中的一些優化實際上會移除exif數據以節省空間。我不能100%確定我剛纔所說的話,所以我可能會錯,但如果我說得對,那就是爲什麼我不認爲這會起作用。此外,我想避免數據庫,除非它是某種單個文件數據庫列出可以包含在圖像文件夾中的文件 – JasonDavis 2012-02-20 02:25:17

+0

@jason - PNG還具有元數據。我添加了兩個鏈接到答案。 – 2012-02-20 02:39:30

+0

感謝您的跟進,經過更多的研究,我傾向於擁有某種數據庫/文件。優選地,位於圖像文件夾中的文件可以列出已經處理過的圖像,然後僅運行在非優化的圖像上,在運行結束時它將更新該列表文件以包括剛纔的圖像文件處理。我的主要原因是,如果有數百個文件,它將不得不讀取所有這些文件的一部分來獲取exif和元數據,我認爲文件/數據庫可能會更快一些。對這種方法有什麼想法? – JasonDavis 2012-02-20 03:39:38

0

想到我的腦海就是將簡單的解決方案與更復雜的解決方案混合在一起。當您優化圖像時,將其移至單獨的文件夾。當對原始圖像文件夾進行訪問時,讓您的文件捕獲這些鏈接並將它們路由到一個區域,以查看在優化的文件夾部分中是否存在相同的圖像,如果不存在,優化,移動然後繼續。

我知道我說simple的解決方案,這是一個複雜的悅目的解決方案,但漂亮的部分是,該解決方案將提供一個可擴展的方法,以您的問題。


編輯:還有一件事

我喜歡一個MySQL數據庫的想法,因爲你能如果那一個當然需要增加一個級別的安全性(不是所有的圖像可以被任何人看到)。但它也會使你的鏈接問題(硬編碼問題)不是一個問題。由於所有鏈接都是單個文件,它從數據庫中檢索圖像,唯一發生變化的是獲取生成的變量。這樣,您的項目變得更具可擴展性,並且更容易進行設計更改。

+1

使用.htaccess重定向不是一個可怕的想法,但從長遠來看不會這種可能會損害服務器性能?至於使用MySQL DB來存儲圖像甚至圖像路徑在我的情況下似乎不是一個好主意。我打算在每一個我建立的網站上都使用它,所以我看不到像這樣的圖像數據庫,只是看起來不像一個好主意性能,這是我優化圖像獲得最大值的全部目的性能我可以 – JasonDavis 2012-02-20 02:40:05

+0

如果沒有安全要求,那你就好了。只要有一個好的隱私政策。 – Michael 2012-02-20 03:51:36

1

最簡單的方法很可能是查看每個圖像的最後一次更改的時間。如果在最後一次腳本運行後更改了圖像,則必須在此特定圖像上運行它。 運行腳本時的時間戳可以很容易地保存在一個簡短的文本文件中。

+0

我喜歡有一個想法在上次運行日期/時間的文件夾中的簡單文本文件,並根據該+1檢查每個圖像 – JasonDavis 2012-02-20 02:18:19