2016-03-08 79 views
0

我使用自定義批處理腳本來調整文件夾中所有PNG圖像的大小調整後的副本(33%和66%)。這是我的代碼:使用ImageMagick調整帶索引的PNG圖像,同時保留顏色圖

for f in $(find /myFolder -name '*.png'); 
do 
sudo cp -a $f "${f/%.png/-3x.png}"; 
sudo convert $f -resize 66.67% "${f/%.png/-2x.png}"; 
sudo convert $f -resize 33.33% $f; 
done 

它工作正常,除了當原始圖像索引。在這種情況下,圖像的較小版本是RGB(因此甚至更大的文件大小,然後原始圖像)。

我嘗試了幾個版本,但沒有工作。我猜應該把這個問題整理出來:

for f in $(find /myFolder -name '*.png'); 
do 
sudo cp -a $f "${f/%.png/-3x.png}"; 
sudo convert $f -define png:preserve-colormap -resize 66.67% "${f/%.png/-2x.png}"; 
sudo convert $f -define png:preserve-colormap -resize 33.33% $f; 
done 

但它不起作用。

編輯:

這是更新的合作,但它仍然是它應該(見附件圖像左邊是原始的,權調整)不工作:

for f in $(find /myFolder -name '*.png'); 
do 
    sudo cp -a $f "${f/%.png/-3x.png}"; 
    numberOfColors=`identify -format "%k" $f` 

    convert "$f"              \ 
    \(+clone -resize 66.67% -colors $numberOfColors -write "${f/%.png/-2x.png}" +delete \) \ 
    -resize 33.33% -colors $numberOfColors "$f" 
done 

enter image description here

原圖: Original image

縮放版本: Scaled image

+1

是否需要保留特定的精確色彩映射?或者您希望確定調整大小的圖像很小並且索引爲* a *顏色映射,但您並不介意該顏色映射中包含什麼內容?答案會有所不同。 –

+0

我不介意彩色地圖。我想確保調整後的圖像很小。這是網絡上的視網膜圖像。第一張(原始圖像)用於帶有3dpi屏幕的屏幕等。 –

+0

請您分別提供原始圖像 - 而不是加入到輸出圖像。 –

回答

2

使用「-sample」而不是「-resize」來保留顏色集。這導致調整大小由最近鄰居顏色選擇而不是任何種類的內插來完成。

否則,由於PNG PLTE塊的大小限制爲256色,因此色彩映射最終會超過256種顏色,並且png編碼器無法保留它。不過,我不能保證你會喜歡結果的外觀。

此外,請確保您使用的是最新版本的ImageMagick。 我沒有在當前版本(6.9.3-7)中觀察到這個問題。你的腳本工作正常,併產生乾淨的-2x和-3x圖像。

+0

可能OP可能使用'-resize'以獲得令人滿意的插值,然後使用'-colors 250'或'-colors 60'來讓您的圖書館使用patricised colormap? –

0

有幾件事情來解決這裏...

發現VS水珠

你說你要處理的文件夾中的所有文件,然後使用find將倒查成子目錄也是如此。如果您只想處理當前目錄中的文件,則可以讓bash直接爲您進行匹配。所以,與其

for f in $(find . -name "*.png"); do 

,你可以這樣做:

shopt -s nullglob 
for f in *.png; do 

性能

您運行convert兩次,並加載原始圖像的兩倍,這是不是很有效。您可以運行加載單個映像並調整爲兩種不同大小的單個進程,並將這兩個進程寫入磁盤。所以,與其

for ...; do 
    convert ... 
    convert ... 
done 

你可以寫下面開始一個convert,一旦讀取圖像,在內存中克隆它,並把它寫出來,在內存中刪除備用副本,然後調整原始圖像和重新保存。

for ...; do 
    convert "$f"              \ 
     \(+clone -resize 66.67% -write "${f/%.png/-2x.png}" +delete \) \ 
     -resize 33.33% "$f" 
done 

調色板

看來你實際上只需要輸出碼垛(索引)圖像與「任何」顏色表,而不是用「具體」顏色表。格倫的答案是完美的,如果你想保留一個特定的色彩地圖。但是,如果任何色彩圖表正常,則可以使用-colors將結果圖像中的顏色減少到PNG庫可以決定創建堆疊圖像的級別。格倫知道很多比我寫的更多!但是,我認爲如果將顏色減少到250(或大約),則可能會獲得256個條目的顏色映射,如果將顏色減少到60個左右,則會得到64個條目的顏色映射。所以,你會怎麼做:

shopt -s nullglob 
for f in *.png; do 
    sudo cp ... ... 
    convert "$f"              \ 
     \(+clone -resize 66.67% -colors 250 -write "${f/%.png/-2x.png}" +delete \) \ 
     -resize 33.33% -colors 250 "$f" 
done 

你可以嘗試用色彩其他數字實驗,看看它如何影響文件大小 - 你需要將取決於你的圖像數量。

+0

性能不是我最大的問題(我正在處理幾十張圖片而不是數千張),但它很好用。我想處理目錄和子目錄中的所有圖像,以便找到適合我的作品。解決方案中的問題是,我在文件夾(和子文件夾)中有幾種不同類型的PNG(8位,24位,索引,未索引...),因此我需要不同圖像的不同參數。到目前爲止,請參閱我的帖子編輯。它沒有按預期工作。有大的(方形)不同顏色的區域。 –