ImageMagick 範例 --
調整大小或縮放(一般技巧)

索引
ImageMagick 範例前言和索引
調整影像大小
其他特殊調整大小運算子  
調整大小技巧  
調整大小/重新取樣濾鏡(獨立章節)
Nicolas Robidoux 的重新取樣(獨立章節)
我們將探討以各種方式放大和縮小影像。 影像保持完整,但個別的顏色點會合併或擴展,以使用更小/更大的畫布區域。 請注意,雖然這與影像的解析度(每單位實際長度的像素數)有關,但這更多是影像最終使用方式的產物,而不是直接影像處理的真正關注點。

調整影像大小

最明顯且最常見的影像大小調整方式就是縮放影像。影像內容會被放大,或更常見的情況是縮小以符合所需的大小。但雖然實際的影像像素和顏色會被修改,但影像所代表的內容基本上保持不變。然而,調整影像大小可能是一件棘手的事情。它可能會以非常不利的方式修改影像,而且沒有「最佳方式」,因為什麼是最佳取決於您在調整大小過程中實際想要達成的目標。由於沒有「最佳」或「完美」的方式,因此您可以考慮許多選項。IM 一直致力於提供各種選項,讓您在調整影像大小方面擁有最大的控制權。有無數種可能性、樣式和技術,即使是調整大小的專家也不斷嘗試尋找新的和不同的方式來改變影像大小。當然,對於大多數人來說,一般的預設選項就足夠了,因為它們在設計時考慮了一般用途。調整大小運算子經過精心設計,力求為真實世界的影像產生非常好的結果。也就是說,這並不是說您不能將其用於圖表或線條圖,但對於這種類型的影像,您可能需要使用我們稍後將介紹的一些更進階的選項。
在指定要調整大小的影像時,您應該考慮的首要事情是...
您真的要修改影像嗎? 調整大小會對影像造成巨大的變化,避免或盡量減少不必要的「偽影」至關重要。也許只是稍微修剪邊緣,或對影像進行更一般的裁剪,會比全面調整影像大小產生更好、更理想的結果。它通常看起來會更好,而且留下的區域將是原始影像的完美副本。因為通常最好不要調整影像大小...
如果調整後的影像大小相同,調整大小將不會執行任何操作。
這個規則的例外情況(總是有例外)是,如果您實際上使用「-filter」設定指定了重採樣濾鏡。在這種情況下,會覆寫正常的「如果影像未調整大小則不執行任何操作」的行為,並且會套用濾鏡。但是,許多濾鏡(甚至是預設濾鏡)可能會稍微模糊影像。這是它們的特性之一。因此,通常這種針對無效調整大小的「短路」是一件好事。調整大小運算子的參數是影像應放入的區域。這個區域不是影像的最終大小,而是影像要放入的區域的最大大小。也就是說,因為 IM 會嘗試保留影像的長寬比,而不是最終大小(除非給定「!」旗標),但最終維度中至少有一個(如果不是兩個都)應該與給定的影像參數相符。讓我說清楚...
調整大小會將影像放入要求的大小
不會填充要求的方框大小。
保留長寬比基本上是為了讓輸入影像中的任何圓圈在輸出影像中保持圓形。也就是說,除非您另行指定,否則影像只會調整大小,而不會被壓扁或擠壓。例如,在這裡我嘗試將兩個來源影像(一個較大的影像和一個較小的影像)放入一個大小為 64x64 像素的方形框中。

  magick dragon_sm.gif    -resize 64x64  resize_dragon.gif
  magick terminal_sm.gif  -resize 64x64  resize_terminal.gif
[IM Output] ==> [IM Output]  [IM Output] ==> [IM Output]
如您所見,「-resize沒有產生 64x64 的方形影像。事實上,影像只是放大或縮小到足以適應給定大小。 忽略長寬比(「!」旗標)
如果你想要強制 "
-resize" 忽略長寬比並扭曲圖像,使其始終生成指定大小的圖像,可以通過在大小後添加字符 '!' 來完成。不幸的是,這個字符有時也被各種 UNIX 命令行 shell 用於特殊目的。因此,您可能必須以某種方式轉義該字符以保留它。

  magick dragon_sm.gif    -resize 64x64\!  exact_dragon.gif
  magick terminal.gif  -resize 64x64\!  exact_terminal.gif
[IM Output] ==> [IM Output]  [IM Output] ==> [IM Output]
僅縮小較大的圖像('>' 標誌)
另一個常用的選項是限制 IM,使其僅縮小圖像以適應給定的大小。  永不放大。  這是 '>' 調整大小選項。可以將其理解為僅將調整大小應用於“大於”給定大小的圖像(這有點違反直覺)。

  magick dragon_sm.gif    -resize 64x64\>  shrink_dragon.gif
  magick terminal.gif  -resize 64x64\>  shrink_terminal.gif
[IM Output] ==> [IM Output]  [IM Output] ==> [IM Output]
當放大圖像通常不理想時(因為它往往會產生“模糊”的放大圖像),此選項對於節省圖像的磁盤空間或生成縮略圖非常重要。
僅縮小標誌('>' 標誌)在 UNIX Shell 和 Windows 批處理腳本中都是特殊字符,您需要轉義該字符(在 shell 中使用反斜杠 '\>',在 Windows 批處理中使用 '^>')。它在 HTML 網頁中也很特殊,因此 PHP 腳本也可能需要一些特殊處理。
僅放大較小的圖像('<' 標誌)
與前一個標誌相反的是 '<',它只會放大小於給定大小的圖像,很少使用。最顯著的用途是與 '1x1<' 等參數一起使用。此調整大小參數實際上永遠不會調整任何圖像的大小。換句話說,它是一個空操作,它允許您在始終使用 "-resize" 的程序和腳本中縮短調整大小操作。除此之外,您可能實際上並不想使用此功能。使用此“短路”參數的一個示例是 "-geometry" 設置 "magick montage"。有關更多詳細信息,請參閱蒙太奇和幾何,需要注意
僅放大標誌('<' 標誌)在 UNIX Shell 和 Windows 批處理腳本中都是特殊字符,您需要轉義該字符(在 shell 中使用反斜杠 '\<',在 Windows 批處理中使用 '^<')。它在 HTML 網頁中也很特殊,因此 PHP 腳本也可能需要一些特殊處理。
填充區域標誌('^' 標誌)
從 IM v6.3.8-3 開始,IM 現在有一個新的幾何選項標誌 '^',用於根據最小的擬合尺寸調整圖像大小。也就是說,調整圖像大小以完全填充(甚至溢出)給定的像素區域。

  magick dragon_sm.gif    -resize 64x64^  fill_dragon.gif
  magick terminal.gif  -resize 64x64^  fill_terminal.gif
[IM Output] ==> [IM Output]  [IM Output] ==> [IM Output]
就目前而言,此選項似乎不是很有用,但是當與居中(或非居中)的 "-crop" 或 "-extent" 結合使用以移除圖像的多餘部分時,您可以調整圖像以完全填充指定的區域。調整大小和最終圖像大小參數都應該是相同的值。雖然 "-crop" 是最合乎邏輯的,但它可能需要額外的 "+repage" 來移除虛擬畫布分層信息。"-extent" 不需要此清理,但仍允許使用 "-gravity" 進行定位。有關更多信息,請參閱剪切和邊框

  magick dragon_sm.gif      -resize 64x64^ \
          -gravity center -extent 64x64  fill_crop_dragon.gif
  magick terminal.gif    -resize 64x64^ \
          -gravity center -extent 64x64  fill_crop_terminal.gif
[IM Output] ==> [IM Output]  [IM Output] ==> [IM Output]
此外,"-extent" 也可用於使用普通調整大小(使用 "-background" 顏色設定)的圖像上進行填充。如需此類操作的詳細資訊,請參閱縮略圖,適配指定空間摘要
請記住,這需要 IM v6.3.8-3 或更高版本才能使用。否則,請使用下面較舊的調整大小以填充指定空間技術。
填充區域標記('^' 標記)是 Windows 批次檔中的特殊字元,您需要將該字元加倍以進行跳脫。例如,'^^',否則將無法運作。如需此項和其他視窗特殊性的詳細資訊,請參閱Windows 批次檔腳本
百分比調整大小('%' 標記)
在 "-resize" 參數中添加百分比符號 '%' 會導致調整大小以按指定量縮放圖像。

  magick dragon_sm.gif    -resize 50%  half_dragon.gif
  magick terminal.gif  -resize 50%  half_terminal.gif
[IM Output] ==> [IM Output]  [IM Output] ==> [IM Output]
但請注意,圖像的最終像素大小將四捨五入到最接近的整數。也就是說,您不會沿著圖像邊緣生成部分像素!因此,實際比例可能與您提供的縮放比例不完全匹配,甚至 X 和 Y 方向可能略有不同,但會非常接近。(請參閱下面的使用扭曲調整大小)。
如果您真的想要調整圖像大小,以使最終大小看起來像是有部分像素大小差異,則可以使用一般扭曲運算符,特別是縮放-旋轉-平移(請參閱下面的扭曲調整大小)。
百分比調整大小標記('%' 標記)是 Windows 批次檔中的特殊字元,您需要將該字元加倍以進行跳脫。例如,'%%',否則將無法運作。如需此項和其他視窗特殊性的詳細資訊,請參閱Windows 批次檔腳本
所有這些「標記」選項 '!'、'<'、'>'、'^'、'%' 和 '@' 只是 "-resize" 運算符的開/關開關。重要的是調整大小參數中字元的存在(或不存在),而不是它們的位置。它們可以出現在參數的開頭或結尾,或在單個數字之前或之後(儘管不能出現在數字中間)。

也就是說,'%50' 與 '50%' 的效果完全相同,儘管後者可讀性更高。此外,'50%x30' 實際上意味著 '50%x30%',而不是您可能認為的 50% 寬度和 30 像素高度。

所有使用「幾何」樣式('WxH' 或 '+X+Y')參數的 IM 參數都是如此。但是,偏移量(如 '+X+Y')永遠不會被視為百分比。
使用像素區域計數限制調整大小('@' 標記)
最後還有一個 "-resize" 選項標記。「at」符號 '@' 將調整圖像大小,使其包含的像素數不超過給定數量。例如,這可用於使所有不同大小的圖像集合大致相同大小。例如,在這裡,我們將兩個圖像的大小都調整為大約 64x64 大小,或 4096 像素大小。

  magick dragon_sm.gif    -resize 4096@  pixel_dragon.gif
  magick terminal.gif  -resize 4096@  pixel_terminal.gif
[IM Output] ==> [IM Output]  [IM Output] ==> [IM Output]
請注意,最終圖像大小不限於高度或寬度為 64 像素,但其面積將盡可能接近(但小於)此大小。這意味著一個維度通常會略大於 64 像素,而另一個維度會略小。在某些方面,這是縮略圖圖像的理想折衷方案。請參閱區域擬合縮略圖大小。您還可以添加 '>' 標記,以僅縮小像素數超過計算值的圖像,而保留已經小於該大小的圖像。
遺憾的是,在使用「區域調整大小」時,目前會忽略 '<'(放大較小的圖像)標記。

圖像讀取期間調整大小
調整大小運算子也可以在讀取影像後立即套用,在將其新增到目前的影像序列和讀取下一個影像之前。這樣一來,讀取大量影像時僅需使用最少的記憶體。如需更多詳細資訊,請參閱影像讀取修飾詞。例如...

  magick dragon_sm.gif'[64x64]'    read_dragon.gif
  magick terminal.gif'[64x64]'  read_terminal.gif
[IM Output] ==> [IM Output]  [IM Output] ==> [IM Output]
這種技術的唯一問題是,在影像讀取過程中,無法使用任何特殊的調整大小選項。
在 v6.2.4 之前的 ImageMagick 版本中,調整大小和透明度會產生問題,導致透明物件周圍出現黑色的光暈效應。經過研究,從該版本開始已修復此問題。如需此舊錯誤的詳細資訊,請參閱調整大小光暈錯誤

Other Resize Operators

Geometry - Resize just the last image

Geometry is a very special option. The operator behaves slightly differently in every IM command, and often in special and magical ways. The reasons for this is mostly due to legacy use and should be avoided if at all possible. First, in "magick display" it is used to size and position the window of the image being displayed. This was its original usage and meaning when IM was first started. It was from this that its other 'resize' capabilities came about. For "
montage" "-geometry" is a setting that is saved until all the arguments have been read in. At this point it then defines the final tile (cell) size (or leaves it up to "magick montage" to work out) while the position arguments are used to specify the space surrounding the tile cells. See Montage Control Settings. In "composite", "-geometry" is also saved until the end of arguments have been reached. Then it is used to resize and position the overlay image (the first image given) before it is overlaid onto the background image (the second image). For example see Composite Multiple Images. As you can see it is used as a 'setting' in most IM commands, but in "magick" "-geometry" is both a special image resizing operator and a positioning setting. What it does is to "-resize" just the last image in the current image sequence. This is the only image processing operator that is designed specifically to effect just the one image (the last one), in the current image sequence. To complicate this special option further, the positional parts of the "-geometry" option is saved by "magick" command, just as it is in "composite". That is, any position is preserved for later use by the "-composite", to position the 'overlay' image, (the second last image in the current image sequence) over the 'background' image (the first image in the image sequence). For this reason, you should limit the use of "-geometry" in "magick" commands to just before a "-composite" or "-layers composite" operations. To summarize, this operator is only really useful after reading or creating a second image, just before you perform some type of Alpha Composition to process with those images. For practical examples of using "-geometry" to resize/position images see Compositing Multiple Images.

Thumbnail - Resize with profile stripping

The "
-thumbnail" operator is a variation of "-resize" designed specifically for shrinking very very large images to small thumbnails. First it uses "-strip" to remove all profile and other fluff from the image. It then uses "-sample" to shrink the image down to 5 times the final height. Finally it does a normal "-resize" to reduce the image to its final size. All this is to basically speed up thumbnail generation from very large files. However for thumbnails of JPEG images, you can limit the size of the image read in from disk using the special option "-define jpeg:size={size}" setting. See Reading JPEG Images for more details. As such this speed improvment is rarely needed for JPEG in thumbnail generation, though profile stripping is still very important. For other image formats, such as TIFF, both profile stripping and speed improvement is still vitally important. As such it is still the recommended way to resize images for thumbnail creation.
在 IM v6.5.4-7 之前的版本中,「-thumbnail」會移除影像中的所有描述檔,包括 ICC 色彩描述檔。從這個版本開始,將會保留色彩描述檔。如果不需要色彩描述檔,請使用「-strip」移除所有描述檔。

重採樣 - 改變影像解析度

與之前的替代調整大小運算子一樣,「-resample」也是對一般「-resize」運算子的簡單包裝。 然而,它的目的是調整影像中的像素數量,以便在給定的 解析度或密度 下顯示時,影像在現實世界中看起來仍然是相同的大小。 也就是說,給定的影像會根據像素數量放大或縮小,而現實世界單位中的影像大小將保持不變。 它旨在用於從特定解析度或密度的程式或裝置讀取或將寫入特定解析度或密度的程式或裝置的影像。 這對於調整影像以適應特定的硬體輸出裝置尤其重要,無論是顯示器、印表機還是特定解析度的 Postscript 或 PDF 影像格式。 請記住,影像的實際大小不會改變,只會改變其解析度,當然還有用於表示影像的像素數量。 例如,假設您有一張以 300dpi(每英寸點數)掃描的影像。 影像以這個解析度(密度)儲存,或者當您將其讀入 IM 時,您將其指定為 300dpi 影像(使用「-density」)。 現在您決定將其顯示在解析度為 90dpi 的螢幕上,因此您執行「-resample 90」。 IM 現在會將影像的大小調整為 90/300 或原始影像大小的 30%,並將影像的新密度設定為 90dpi。 就使用的像素數量而言,影像現在變小了,但如果在 90dpi 的顯示器上顯示,則會顯示與您掃描的原始影像相同的實際大小。 也就是說,它現在具有適合 90dpi 顯示器的解析度,因此它將以其原始的實際大小顯示給使用者。 在某些情況下,可能需要「-units」設定(參數為「PixelsPerInch」或「PixelsPerCentimeter」)才能使此運算子正常運作。 此設定對於輸出為 Postscript 和 PDF 影像檔案格式也很重要。 請注意,只有少數影像檔案格式(例如 JPEG、PNG 和 TIFF)能夠將影像解析度或密度與影像資料一起儲存。 對於不支援影像解析度或多解析度(基於向量的)影像格式,必須在讀取影像之前,透過「-density」屬性(請參閱 密度影像中繼資料)指定影像的原始解析度。 如果未設定密度屬性,IM 將假設其預設密度為 72dpi。 在讀取此類影像後設定密度只會影響其輸出解析度,而不會影響其最終的像素大小。

縮放 - 使用像素平均值縮小

「-scale」調整大小運算子是一種簡化的、更快速的調整大小指令形式。 放大影像時,影像中的像素會被複製以形成大的矩形色塊。 這對於顯示清晰、未模糊的影像放大效果非常有用。 例如,以下是其中一個內建拼貼樣式的放大檢視...

  magick -size 8x8 pattern:CrossHatch30 -scale 800% scale_crosshatch.gif
[IM Output]
通常,影像放大使用 100% 的倍數百分比值,以確保所有像素都放大相同的量,否則可能會出現不同大小的像素行和列,從而產生大規模的摩爾紋圖案。
例如,在這裡,我錯誤地縮放了一個看起來很平滑的「50% 灰色方格」樣式,使用的尺寸不是原始影像尺寸的倍數。

  magick pattern:gray50 scale_gray_norm.gif
  magick pattern:gray50 -scale 36 scale_gray_mag.gif
[IM Output]
==>
[IM Output]
縮小影像時,會將相鄰像素平均在一起以產生新的彩色像素。例如,將影像縮放到原始大小的 50%,實際上會將 4 個像素的區塊平均在一起以建立新的像素(假設影像大小也是 2 的倍數)。但請注意,縮減後的影像也可能會產生摩爾紋,除非新影像是精確的整數縮減(一種稱為「分箱」的技術),這也需要原始影像大小是最終大小的精確整數倍。此外,使用「-scale」大幅縮小的真實照片往往看起來過於銳利,並且沿著銳邊會出現鋸齒(「階梯」)效應。「-scale」的像素平均允許其生成「像素化」的影像。您基本上是先縮小影像大小以對像素進行平均,然後再放大回影像的原始大小。

  magick rose: -scale 25%  -scale 70x46\!  rose_pixelated.gif
[IM Output] ==> [IM Output]
您可以使用遮罩將上述像素化影像與原始影像組合在一起,以便「隱藏」原始影像中存在的較小「不雅」部分。如需使用此技術的範例,請參閱保護某人匿名的範例。演算法也設計為先循環遍歷像素行,然後循環遍歷列,這與「-resize」的順序相反。這可能允許「-scale」更好地處理「mpc:」磁碟快取的影像。
在 IM v6.4.7 之前,「-scale」仍然包含舊的調整大小光暈錯誤

縮放內部機制(像素混合)...

在許多方面,
縮放運算子類似於一般的調整大小運算子,但使用的是「方框重採樣濾鏡。但是,它實際上使用了一種完全不同的演算法,其結果比方框濾鏡產生的結果稍微準確一些。方框濾鏡的工作方式是簡單地對落在濾鏡「支持窗口」內的任何像素(樣本)進行平均(請參閱濾鏡支持專家控制)。這表示當將影像縮小非常小的量時,使用方框濾鏡調整大小只會產生精確的像素值,或完全平均的像素值。然而,縮放運算子使用一種不同的演算法,稱為(姑且稱為)像素混合。它不是根據「支持窗口」內的「像素平均值」生成顏色,而是使用「支持窗口」內的更準確的「像素面積」。例如,在這裡,我以「棋盤格」像素圖案為例,將其縮小 2 個像素,比較縮放與使用非常簡單的方框和三角形濾鏡調整大小的結果。

  magick -size 10x10 pattern:gray50  checks.gif
  magick checks.gif  -filter box      -resize 8x8  checks_box.gif
  magick checks.gif                   -scale  8x8  checks_scale.gif
  magick checks.gif  -filter triangle -resize 8x8  checks_triangle.gif
[IM Output]
10 像素「雜湊」
==> [IM Output]
方框濾鏡
調整大小
[IM Output]
像素混合
縮放
[IM Output]
三角形濾鏡
調整大小
上面的影像是經過大幅放大的
上面顯示的是「純平均」、「像素混合」和「線性插值」的結果。它還顯示了縮放運算子實際上與三角形濾鏡相似,但僅限於對影像進行非常小的縮小時。在其他情況下(大幅縮小、放大或精確的整數大小調整),它將產生更像方框濾鏡的結果。基本上,它會根據影像縮小的程度生成介於方框和三角形濾鏡之間的混合物。放大時也會看到類似的效果。

  magick -size 8x8 pattern:gray50  checks_sm.gif
  magick checks_sm.gif -filter box      -resize 10x10 checks_sm_box.gif
  magick checks_sm.gif                  -scale  10x10 checks_sm_scale.gif
  magick checks_sm.gif -filter triangle -resize 10x10 checks_sm_triangle.gif
[IM Output]
10 像素「雜湊」
==> [IM Output]
方框濾鏡
調整大小
[IM Output]
像素混合
縮放
[IM Output]
三角形濾鏡
調整大小
上面的影像是經過大幅放大的
放大圖像時,方塊濾鏡 永遠不會產生「平均像素」,只會複製像素的行/列。 然而,縮放會沿著邊緣產生平均顏色像素,這與 三角濾鏡 非常相似,但並不完全相同。 當然,這種效果只有在非整數的小比例放大時才真正可見,而在較大的縮放比例下,這種效果只會出現在邊緣,在更典型的情況下,您可能會得到一兩個平均像素。 總之:縮放 比普通的 調整大小運算符 快得多,因為它在圖像處理需求方面不那麼通用。 但它也是一種完全不同的算法,在使用非整數比例調整圖像大小時會產生略有不同的結果。 有關更多詳細信息,請參見 像素混合 頁面,以及 IM 論壇討論,線性放大幾個像素。 特別感謝論壇用戶 atnbueno,他指出了上述差異。

範例 - 通過複製/刪除行/列調整大小

-sample 調整大小運算符是最快的調整大小運算符,尤其是在大規模縮小圖像時。 實際上,它甚至比 "-scale" 運算符還要快(見上文)。 放大圖像時,它只會執行像素複製(根據 方塊濾鏡),生成像素顏色的矩形「塊」。 然而,在縮小圖像時,"-sample" 只會刪除像素的行和列。 由於只是簡單地添加或刪除了整行和整列的像素,因此 "-sample" 不會產生新的或額外的顏色。 這一事實對於某些圖像處理技術(例如調整 GIF 動畫大小)非常重要。 換一種說法,圖像在整個圖像中以非常均勻的規則模式「採樣」了單個像素。 您可以將圖像視為被劃分為一個區域陣列,並且從每個區域中選擇一個像素作為結果圖像。 然而,這種對單個像素的「採樣」(或對整行/列的刪除)可能會產生相當糟糕的結果,尤其是對於包含細線(以像素寬度表示)的圖像。 例如,這裡我畫了一條線,然後縮小圖像大小,導致只有一條點線。

  magick -size 150x60 xc: -draw 'line 0,59 149,0' line_orig.gif
  magick line_orig.gif  -sample 50x20  line_sample.gif
[IM Output] ==> [IM Output]
這是影像取樣時會出現的典型效果,被稱為嚴重的 鋸齒 效果。

取樣像素的偏移

從 IM v6.8.4-7 版本開始,每個取樣子區域中被取樣的精確像素被定義為該區域中心點的像素(如果子區域的像素數量為偶數,則為左上角中心的像素)。這意味著,如果您對影像進行單一像素取樣,您將獲得影像的中心像素。
在 IM v6.8.4-7 之前的版本中,所選的像素是每個區域的左上角像素。但是,有報告指出,在某些版本中,所選的像素可能是右下角像素,或者甚至可能因為錯誤而略有變化。
這種資訊對於將影像縮小為原始影像大小的整數倍數時特別有用。例如,當您要建立或取樣像素化影像,或
對影片畫面進行去交錯處理 時。此外,從該版本開始,您可以使用 定義 "sample:offset" 來精確控制每個子區域中選擇哪個像素,它接受一個或兩個百分比值(默認為 '50' 表示中心點)。請注意,這裡使用百分比是因為在一般情況下,「取樣子區域」可能與像素邊界不對齊。這就是為什麼需要使用百分比而不是「像素偏移量」的原因。但是,如果影像大小可以被取樣數量整除,那麼您可以輕鬆計算出您想要從每個子區域中提取的精確像素。例如,如果影像被取樣為 5 個像素的子區域(例如,將一個寬度為 100 像素的影像取樣為 20 個像素樣本),那麼您可以使用 0 到 19.9 的取樣偏移百分比來選擇每個區域中的第一個像素,使用 20.1 到 39.9 來選擇第二個像素,依此類推。換句話說,您可以使用 10、30、50、70 和 90 的百分比值來精確指定您想要從每個固定大小的取樣區域中提取的精確像素。有關取樣偏移的更多資訊,請參閱 IM 論壇討論區的 取樣點

放大 - 像素縮放

"
-magnify" 選項會將影像的大小加倍,但它使用的是一種稱為「像素縮放」的技術,使用的是 Scale2X 演算法。此演算法會嘗試在不增加額外顏色的情況下,平滑放大像素的邊角。因此,非常小的像素化影像可以更清晰地放大,同時保留原始顏色和較小影像的「復古像素外觀」。

  magick -size 8x8 pattern:CrossHatch30 -virtual-pixel tile \
          -magnify -magnify -magnify magnify_crosshatch.gif
[IM Output] ==> [IM Output]
請注意,這裡使用了 虛擬像素 設定,以確保 magnify 了解此特定影像的邊緣是「環繞」的。
在 IM v6.8.4-10 之前的版本中,magnify 只是 resize 的包裝函式,用於將影像的大小加倍。這並不是很有用,也很少被使用。使用「像素縮放」讓這個選項變得更有用。有關更多資訊,請參閱 IM 使用者論壇上的 像素縮放
在 API 中通常也提供「Minify()」函式,用於將影像的大小減半,但它只是 resize 的包裝函式。但是,在撰寫本文時,「-minify」還不能在命令列 API 中使用。

自適應調整大小 - 不模糊的小幅調整大小

-adaptive-resize」運算子使用特殊的 網格插值 方法來調整影像大小。例如,這裡我調整了一條簡單線條的大小,首先使用普通的「-resize」,然後再次使用「-adaptive-resize」。

  magick -size 50x50 xc: -draw 'line 0,49 49,0'  line_orig2.gif
  magick line_orig2.gif           -resize 80x80  line_resize.gif
  magick line_orig2.gif  -adaptive-resize 80x80  line_adaptive.gif
[IM Output] ==> [IM Output] [IM Output]
如果您查看兩個結果的放大圖...
[IM Output] [IM Output]
您可以看到右側的 自適應調整大小 影像比左側使用普通「-resize」運算子產生的影像看起來更清晰,模糊程度更低。基本上,該運算子避免了「-resize」運算子在顏色急劇變化時可能產生的過度模糊。這適用於輕微的影像大小調整,特別是放大,尤其是具有急劇顏色變化的影像。但是,與所有像素插值方法一樣,當影像放大或縮小超過 50% 時,它會產生鋸齒和摩爾紋效應。您也可以使用 扭曲調整大小 操作產生完全相同的結果,但使用選項「-filter point -interpolate mesh」。也就是說,使用簡單的 網格插值 查找方法調整影像大小,而不是更複雜的重採樣濾波器。

插值調整大小 - 使用插值方法調整大小

-interpolative-resize」運算子實際上與之前的 自適應調整大小 運算子相同。但是,此運算子將使用當前的「-interpolate」設定,而不是固定的「Mesh」插值方法。

如果您使用「-interpolate」設定為「Nearest」,您將基本上獲得與 採樣運算子 相同的效果。同樣,許多其他 簡單插值方法 將等同於使用等效的 插值調整大小濾波器。但是,有許多插值方法(例如 網格)沒有等效的調整大小濾波器。

這也是一種未縮放的調整大小,這表示它適用於放大和縮小,但當縮小超過 50% 時,會出現嚴重的 鋸齒效應,如上面的其他「取樣調整大小運算子」所示。

液態縮放 - 接縫裁剪

就像 取樣 影像會透過直接移除或複製影像中的整行和整列像素來調整大小,特殊的 IM 運算子「-liquid-rescale」也會移除或複製影像中的像素行和列,以縮小/放大影像。不同之處在於,它會嘗試以更智慧的方式執行此操作。首先,它不會移除簡單的像素線,而是移除像素的「接縫」。也就是說,行(或列)可以在影像中以最多 45 度的角度鋸齒形移動。其次,它會嘗試移除在影像內容方面「最不重要」的接縫。它是根據影像的能量,或者更簡單地說,是特定「接縫」涉及的顏色變化量來選擇的。變化量最少的「接縫」將首先被移除,然後是較高「能量」的接縫,直到影像達到所需的大小。如需有關液態調整大小和接縫裁剪的詳細資訊,請參閱維基百科:接縫裁剪YouTube 影片示範PDF 論文:用於內容感知影像調整大小的接縫裁剪。例如,以下是使用 IM「-liquid-rescale」運算子調整大小後的 IM 標誌。

  magick logo: -resize 50% -trim +repage  logo_trimmed.jpg
  magick logo_trimmed.jpg  -liquid-rescale 75x100%\!  logo_lqr.jpg
  magick logo_trimmed.jpg  -sample 75x100%\!  logo_sample.jpg
[IM Output]
原始圖像
==> [IM Output]
液態縮放
[IM Output]
取樣
請注意「-liquid-rescale」如何在壓縮較不複雜的星星和影像標題部分的同時保留複雜的巫師。它還稍微擠壓了巫師的右腳,使其斗篷邊緣產生了一些鋸齒狀,就像它對巫師纖細但簡單的魔杖所做的那樣。另一方面,取樣調整大小影像只是簡單地移除了等距的像素列,導致整個影像變得同樣失真。星星沒有完整保留,所有邊緣都有明顯但均勻的 鋸齒效應。基本上,「-liquid-rescale」會產生一個通常看起來更好的「壓縮」影像,而不會產生額外的「混合顏色」或影像模糊。但是,您可能會在一個位置(在這種情況下是巫師的魔杖)獲得一些輕微但局部的鋸齒效應,而不是將該效應擴散到整個影像中。它還會透過「加倍」影像中找到的接縫來擴展影像。

  magick logo_trimmed.jpg  -liquid-rescale 130x100%\!  logo_lqr_expand.jpg
[IM Output] ==> [IM Output]
如您所見,它會嘗試首先將各個物件之間的空間量加倍(如果可以),將它們分散開來。但在這種情況下,最左邊的星星和「m」會變得失真,因為穿過這些「低能量」區域的「接縫」會聚集在一起。但是請注意,它只會將每個接縫加倍一次,因此當影像被放大太多時,該技術就會開始失效。一種更好的方法通常是先將影像調整為較大的尺寸,然後使用液態縮放將其縮小到所需的大小。或者以多個較小的步驟使用「-liquid-rescale」。為了更好地顯示「-liquid-rescale」的效果,這裡有一個動畫,顯示了相同的影像如何縮小到非常薄的影像,然後再次放大。此動畫是使用 shell 指令碼 animate_lqr 建立的。
[IM Output]
再次注意當圖像被壓縮到越來越小的區域時,它是如何嘗試保留圖像中最複雜的部分。也就是說,標題中的空格會優先被壓縮,然後是巫師的手臂,然後是巫師的右側,最後才處理巫師最複雜的中间部分。特別要注意星星是如何在最終受到液態縮放實現的重新採樣像素移除影響之前被推擠在一起的。(見下文問題)您可以將液態縮放想像成試圖壓縮圖像,就像一塊海綿,開放區域首先被壓縮,留下體積較大和結構更複雜的部分留到最後。接縫縮放問題液態縮放或接縫縮放,僅通過從圖像中移除整個像素來運作。因此,就像採樣一樣,它不會生成或合併顏色,並且圖像中的直線和圖案可能會因操作而嚴重扭曲。基本上,它可能會導致嚴重的鋸齒效應,除非還應用了一些平滑方法。然而,通常鋸齒效應會被分組並局限在圖像中不太複雜的區域,而不是分散在整個圖像中。這就是它如此有效的原因!由於“接縫”可以在圖像中曲折前進,因此接縫可以而且經常會繞過複雜的物體,在嘗試壓縮物體本身之前先移除物體之間的空間。例如,請注意上述演示中“Image”一詞如何在標題中的其他字母下方被推擠,而沒有太多失真。然而,這種左右移動僅限於 45 度角。對於背景“繁忙”而前景物體“不繁忙”的圖像,例如包含人臉的照片,能量函數可能會認為前景物體不如背景重要。這會導致一些嚴重的負面副作用,可能需要人工干預才能解決。
液態縮放目前是 IM v6.3.8-4 中添加的高度實驗性操作。它需要安裝“liblqr”代理程式庫才能運作。

目前尚未提供專家用戶控制。例如修改使用的內容能量函數,或使用用戶提供的保留/移除濾鏡(調整該能量函數),或訪問程式庫還提供的中間接縫縮放圖像和函數。我們假設將來會根據用戶的需求以及我們對程式庫函數有更多內部控制權時提供此類控制。

警告不要指望它會保持原樣。它具有高度實驗性,預計其功能會發生變化和擴展。

變形調整大小 - 自由形式調整大小

以上所有調整大小的方法都有一個我們前面提到的限制,它們會將新圖像的大小四捨五入為整數像素,然後將舊圖像的像素映射到新的像素陣列。這會產生兩個影響。首先,當調整到非常小的尺寸時,X 比例可能與結果圖像的 Y 比例不完全匹配(縱橫比略有不同)。這種差異很小,除非你變得非常小,否則通常不會注意到。另一個影響是您無法調整圖像大小以適應包含部分像素邊緣的區域,這在進一步處理中可能很重要,例如圖像疊加。這也意味著您不能使用調整大小來僅將圖像向右移動(平移)半個像素(不進行實際調整大小),即使算法很容易做到這一點。使用 IM v6.3.6,
通用失真運算符-distort」讓您使用其 縮放-旋轉-平移 失真方法來做到這一點。您也可以使用基於控制點移動的 仿射 失真來做到這一點。但是請注意,由於圖像的邊緣可能包含部分像素,因此最終圖像可能會比您預期的要大 2 到 3 個像素。額外的周圍像素將根據當前的 虛擬像素 設置進行混合,您通常將其設置為透明。例如,在這裡,我將玫瑰圖像的大小調整為其原始大小的 90% (.9),不旋轉 (0),圍繞圖像中心(如果未指定,則為默認控制點)縮小它...

  magick rose: -alpha set -virtual-pixel transparent \
          +distort SRT '.9,0' +repage  rose_distort_scale.png
[IM Output]
它看起來可能沒有改進,實際上它的邊緣很模糊,但它是一個精確的調整大小,沒有針對最終整數圖像大小進行調整,就像您要求的那樣。正因為如此,邊緣才會變得模糊,因為像素顏色被分散在像素大小的分數上,而不僅僅是整數。請注意,我使用了「+distort」的「加號」形式,以允許此圖像的處理運算符在 虛擬畫布 上正確設置最終圖像大小和偏移量,以進行進一步的處理和分層。如果不需要此偏移量,則可以使用「+repage」運算符將其刪除。但如果保留在原位,則會保留較大畫布上的實際圖像位置,從而允許您使用其「模糊邊緣」正確定位圖像。在這裡,我調整了它的大小,使左上角 (0,0) 向右移動了 .5 個像素(到 .5,0),圖像的其餘部分圍繞該控制點縮放...

  magick rose: -alpha set -virtual-pixel transparent \
          +distort SRT '0,0  .9  0  .5,0' +repage  rose_distort_shift.png
[IM Output]
請注意,由於頂部邊緣實際上沒有移動,因此它保持相對清晰,而所有其他邊緣都變得模糊。這是頂角的像素放大圖,顯示了失真添加的透明度,以提供亞像素調整大小...

  magick rose_distort_shift.png -crop 15x15+0+0 +repage \
          -scale 600%   rose_distort_shift_mag.png
[IM Output]
您可以看到頂部邊緣保持清晰,而左側(和所有其他邊緣)現在是半透明的。這就是重點。您可以精確控制調整大小,以及最終圖像的亞像素位置。不僅僅是調整後的圖像量化到整數像素。也就是說,失真是圖像精確地重新縮放和定位到像素的分數,允許您將其精確地擬合到其他圖像中。這在進行視頻工作時尤其重要,因為嵌入圖像的不精確調整大小會產生「震動」效果。
技術上來說,影像縮放是 影像扭曲 的一種簡化形式,兩者都是影像重新取樣的技術。它是一種非常快速的雙通道濾波技術,僅限於正交對齊的像素縮放,並且最終結果中的像素數量為整數。
仿射變換 從 IM v6.4.2-8 版本開始,舊的 "-affine" 設定與 "-transform" 或 "-draw" 運算子一起使用,提供了類似的自由形式縮放功能。然而,實際上它等同於呼叫 "+distort" 並使用 'AffineProjection' 扭曲方法。因此,所有先前的扭曲注意事項都適用。它確實需要更多的數學運算,這使得一般使用者難以使用。通常,最好使用上述的扭曲方法,它提供了許多指定要應用的仿射扭曲的替代方法。

扭曲與縮放

如果您確實想直接比較使用 扭曲縮放,則需要特別限制影像的扭曲,以便與您要比較的縮放影像完全匹配。這並非易事。為了簡化這個過程,在 IM v6.6.9-2 中添加了一個特殊的 縮放扭曲方法。例如,在這裡我使用快速的 縮放 大幅放大了內建的 "rose:",然後使用 扭曲...

  magick rose: -filter Lanczos -resize 300x rose_resize.png

  magick rose: -filter Lanczos -distort Resize 300x rose_distort.png
[IM Text]
縮放(Lanczos - Sinc)
[IM Text]
扭曲(Lanczos - Jinc)
如果您沿著玫瑰花瓣的底部邊緣觀察,您會發現 扭曲運算子 實際上產生了比 縮放運算子 更好、更清晰的結果。放大影像時常見的 區塊效應 很少。除了底部邊緣之外,其餘影像實際上是相同的,即使使用 "flicker_cmp" 腳本進行比較也是如此。但是請記住,扭曲縮放 慢得多,因為它使用更直接但更複雜的 區域重新取樣 技術,而沒有縮放使用的雙通道速度優化。
上面兩張影像的真正區別在於 扭曲運算子 使用二維 橢圓區域重新取樣 濾波方法(也稱為圓柱濾波或重新取樣)進行影像處理。這比本節中顯示的所有其他縮放方法使用的一維、雙通道重新取樣方法慢。這也是為什麼它在上面放大的玫瑰花瓣影像的對角線底部邊緣產生更好結果的原因。它不僅限於水平和垂直濾波。

您可以在 振鈴效應 的示例中看到這種情況對振鈴的影響。



縮放技術

使用色彩空間校正調整大小

雖然縮放效果很好,但大多數人都沒有正確使用它。即使我通常也只是直接在影像上使用縮放,因此從技術上講,我錯誤地縮放了影像。影像通常使用非線性 "sRGB" 色彩空間或伽瑪校正存儲。有關詳細信息,請參閱 人類色彩感知。但縮放(像大多數其他影像處理運算子一樣)是一種數學線性處理器,它假設影像值直接代表線性色彩亮度。"sRGB" 色彩空間基本上包含大約 2.2 的伽瑪校正。實際上,它比涉及兩條獨立曲線的情況更為複雜。請參閱 維基百科,sRGBW3org,sRGB 互联网的默认色彩空间。從 6.7.5 版本開始,ImageMagick 遵循此約定,並將影像的默認色彩空間(至少對於大多數影像文件格式)定義為 sRGB。這意味著我們只需使用 "-colorspace" 在縮放之前將影像轉換為線性空間即可。
由於低畫質 Q8 版本的 IM (參見 品質) 所提供的精度損失,因此不建議對其進行色彩校正。
美國太空總署的影像「地球城市燈光」是一個非常極端的例子,其中非線性色彩空間效應對影像大小調整的結果有很大的影響。在這裡,我們直接調整影像大小,而不進行色彩空間校正...

  magick earth_lights_4800.tif -resize 500 earth_lights_direct.png
[IM Text]
在這裡,我們將非線性 sRGB 轉換為線性 RGB,然後調整它們的大小,再將其轉換回來...

  magick earth_lights_4800.tif -colorspace RGB     -resize 500    \
          -colorspace sRGB  earth_lights_colorspace.png
[IM Text]
如您所見,影像中的「燈光」變得更加明亮,因為它們不受來源影像非線性色彩空間的嚴重影響。雖然大多數影像的影響不如上面所示的那麼大,但它確實存在,並且會產生許多影響。sRBG 非線性效應的主要影響是,較暗的顏色會儲存為更暗的值(以便在視覺上更相關)。但由於它們較暗,因此在數學上無法正確處理,所以產生的 sRGB 影像比在線性色彩空間(如 RGB(或 LAB 或 LUV))中處理的影像更暗。另請參閱 處理真實影像的色彩使用 Gamma 和色彩空間校正進行繪製。相同的正確色彩空間處理也適用於扭曲(橢圓濾鏡)、影像模糊的使用,並且對影像量化、抖動和有序抖動有很大的影響。這在重採樣濾鏡中有詳細介紹。警告:RGB 色彩空間可能會沿著涉及強烈原色變化(不僅僅是黑白之間)的邊緣產生裁剪問題。請參閱下一節。
在 v6.7.5 之前的 IM 版本中,預設輸入色彩空間為「RGB」。「sRGB」色彩空間實際上意味著「從 sRGB 轉換為線性 RGB」。結果是兩個標籤被交換了!*奇怪但卻是事實*。因此,舊版本的 ImageMagick 需要使用交換的色彩空間名稱來進行上述色彩空間校正。像這樣...

  magick earth_lights_4800.tif -colorspace sRGB \
          -resize 500  -colorspace RGB  earth_lights_colorspace.png
*** 此範例已棄用 ***
請注意,「-colorspace RGB」操作實際上並不需要,因為在儲存為 PNG 影像檔案格式時會自動執行。以上內容是從 IM 論壇討論 正確調整大小 中發展而來的。

使用 Gamma 校正調整大小

以下是使用 Gamma 校正正確調整影像大小的方法。

  magick earth_lights_4800.tif   -gamma 0.454545 \
          -resize 500    -gamma 2.2  earth_lights_gamma.png
[IM Text]
Gamma 反向運算「-gamma 0.454545」的替代方法是使用「-evaluate POW 2.2」。請注意,Gamma 校正只是將影像從/向 sRGB 色彩空間正確轉換的粗略匹配,但它非常接近,以至於您很難看出色彩空間與 Gamma 校正之間的任何差異。Gamma 校正也不會影響 IMv7 RGB/sRGB 色彩空間設定,因此當確切版本未知時,它可能是更好的選擇。您可能還想查看「-auto-gamma」運算子,它會嘗試調整影像,以便產生等量的亮區和暗區(假設影像是線性色彩空間)。

在 LAB 色彩空間中調整大小

在調整大小或進行任何圖像處理時,使用 sRGB、RGB 甚至是 XYZ 色彩空間的一個問題是,這 3 個色彩通道不僅代表顏色,還代表強度或亮度。這意味著如果一個通道失真(例如被裁剪),像素顏色也會失真,並可能導致看起來很奇怪。LAB 色彩空間不僅是一個線性色彩空間,而且它的設計是將強度(L 通道)與兩個色彩通道(A* 和 B* 通道)分開。這意味著即使其中一個通道被裁剪,也不會產生顏色偏差。這也意味著,除非您專門處理純黑白圖像(這在現實生活中的圖像中並不常見),否則通常沒有任何通道實際上接近裁剪限制。因此,通過使用 LAB 色彩空間處理圖像,實際上效果更好,並且可以避免使用 RGB 或 XYZ 色彩空間時可能出現的裁剪和顏色偏差。
在 IM v6.7.8-2 之前,A* 和 B* 通道的 LAB 值使用有符號整數存儲,存儲在無符號整數內存空間中。這在負值和正值之間產生了不連續性,導致無法進行正常的處理,只能進行圖像格式轉換。

這意味著在舊版本的 IM 中,LAB 色彩空間中的圖像處理無法正常工作,特別是在涉及正值和負值的顏色時。也就是說,在處理藍黃色和紅綠色之間變化的顏色時。

在這個版本之後,這些值在內部使用 50% 的偏移量存儲,這消除了這種不連續性,從而使線性運算能夠按預期工作。

對於涉及「銳化」重採樣濾波器(非常常用)的調整大小,使用 Lab 色彩空間還可以緩解極端的強度變化,這些變化會在主要的 RGB 顏色中產生過強(和範圍裁剪)的 振鈴偽影。例如...

  magick rose: -colorspace RGB  -filter Lanczos  -distort resize 300x \
          -colorspace sRGB rose_distort_rgb.png
  magick rose: -colorspace LAB  -filter Lanczos  -distort resize 300x \
          -colorspace sRGB rose_distort_lab.png
[IM Output]
原始圖像
==> [IM Output]
RGB 色彩空間
[IM Output]
LAB 色彩空間
如您所見,雖然玫瑰的邊緣在線性 RGB 色彩空間中被裁剪了,但在 LAB 色彩空間中沒有被裁剪。在 RGB 色彩空間中,玫瑰的下邊緣的顏色從接近純白色變為接近純紅色,導致「綠色」和「藍色」通道發生強烈的(負)變化。這會產生非常強烈的「負波瓣」振鈴效應,然後在 RGB 色彩空間中被裁剪。由於濾波器的銳化效應,最終結果是嚴重的顏色失真。在 LAB 色彩空間中,從白色到紅色的偏移在強度或顏色通道中都不會那麼強烈,因此,雖然我們在強度上得到了很好的銳化,但它和顏色通道都沒有被裁剪,從而避免了顏色失真。結果是調整大小後的圖像要好得多,濾波器的銳化效果也更合適。只需將強度與顏色分開即可。

使用 LUV 色彩空間調整大小

從 IM v6.7.8-8 開始,IM 還實現了一個密切相關的色彩空間 LUV。它們都被設計成感知均勻(線性),甚至共享相同的關鍵強度「L」或「亮度」通道結果,儘管計算顏色通道的方式不同。主要區別在於 LUV 顏色軸經過調整,以便具有感知上相等的顏色增量(顏色差異),這導致與 LAB 色彩空間相比,顏色比例略有不同,儘管兩者之間的強度保持不變。請參閱 亞當斯色價色彩空間。LAB 和 LUV 之間調整大小的結果實際上是相同的。

  magick rose: -colorspace LUV  -filter Lanczos  -distort resize 300x \
          -colorspace sRGB  rose_distort_luv.png
[IM Output]
有關這兩種色彩空間的更多信息,請參閱 色彩空間

使用不同色彩空間調整大小的摘要
或者為什麼不使用 LAB 或 LUV 進行調整大小?

因為就像 sRGB 一樣,LAB 和 LUV 色彩空間是非線性感知色彩空間!而這些數學計算原本只適用於線性值。例如,以下是使用「Lab」色彩空間調整「地球城市燈光」影像大小的結果。

  magick earth_lights_4800.tif -colorspace Lab     -resize 500    \
          -colorspace sRGB  earth_lights_lab.png
[IM Text]
結果實際上與直接在感知 sRGB 色彩空間中調整大小所獲得的結果相同。但在感知色彩空間中調整大小真的是一件壞事嗎?這確實是一個有爭議的觀點。它似乎避免了色彩通道的裁切,而色彩偏移(不同色彩通道的不等變化)則不那麼重要。但 LAB 和 LUV 影像在感知上是線性的!因此,在線性感知色彩空間中混合顏色(這實際上是 重採樣濾鏡 所做的)可能是一件好事。最後一點,sRGB 僅在主要顏色分量的強度上是感知線性的。它在色彩上實際上並非感知線性,因此它仍然是一個不適合進行任何形式的影像大小調整的色彩空間。Nicolas Robidoux 將其很好地總結為...
一般來說,線性光色彩空間(線性 RGB 和 XYZ)會產生誇張的暗暈,而「感知」色彩空間(sRGB、LAB、LUV)會產生誇張的亮暈。

如果您仔細想想,這完全合理,因為感知色彩空間在強度光譜的暗端包含了大量的位元,並「挖空」了亮端,以模仿人類視覺系統 (HVS)。因此,在 sRGB 中,1 個單位的暗部過沖比在線性 RGB 中「走」得更少,但 1 個單位的亮部過沖在線性 RGB 中比在 sRGB 中「走」得更少。

S 形函數化(見下文)平等地處理暗部和亮部過沖,並且通常會抑制兩者的極端情況。


使用 S 形色彩空間調整大小

在 ImageMagick 討論區上的一個冗長討論中,「S 形函數最小化重採樣濾鏡暈影」。開發了一種新技術,其中不是嘗試在線性色彩空間中調整影像大小,而是使用 S 形函數色彩修改器運算子 (-sigmoidal-contrast) 在修改後的色彩空間中調整影像大小。這可以減少沿著非常銳利的邊緣可能出現的極端暈影或 振鈴偽影 的裁切。例如,以下是在數位影像處理論壇上討論過的一系列「改進」調整大小技術...

  magick rose: -colorspace RGB  -filter Lanczos  -resize 200x \
          -colorspace sRGB rose_resize_RGB.png
  magick rose: -colorspace RGB  -filter Lanczos  -distort resize 200x \
          -colorspace sRGB rose_distort_RGB.png
  magick rose: -colorspace RGB   +sigmoidal-contrast 6.5,50% \
          -filter Lanczos  -distort resize 200x \
          -sigmoidal-contrast 6.5,50% -colorspace sRGB  rose_sigmoidal_RGB.png
[IM Output]
調整大小(正常線性)
[IM Output]
扭曲(圓柱形)
[IM Output]
S 形函數變化
基本上,上面最後一個範例所做的是在調整大小之前降低影像的對比度,將中間調灰色壓縮到更緊密的線性範圍內,同時將極值進一步拉離裁切邊緣。然後在調整大小之後移除該修改。這反過來又降低了色彩值極端效應的影響,同時仍然允許濾鏡以線性方式處理中間調,以便減少色彩失真。在許多方面,這類似於在預設的非線性 sRGB 色彩空間中調整影像大小(這是一種過於常見的做法),但對於亮部和暗部振鈴偽影都同樣有效。也就是說,它在整個色彩值範圍內是對稱的,而調整 sRGB 色彩空間的大小僅適用於色彩範圍的較低暗端(上圖中的藍色和綠色值)。也就是說,這是一種控制得更多的方法。也有人評論說,這種 S 形函數變化可能只適用於放大。還可以針對不同的影像嘗試不同的 S 形函數對比度強度值(上圖中為 6.5)。請記住,就像所有調整大小技術一樣,結果非常主觀,並且可能不適用於所有影像類型。
S 形函數轉換本質上產生了一個特殊的自訂非線性色彩空間,它建立在使用非線性感知色彩空間 (sRGB) 時獲得的先前結果之上。

請注意,在 RGB 色彩空間中調整(扭曲)具有非線性顏色通道的圖像大小,可能會導致每個顏色通道產生略有不同的結果。這會導致輕微的顏色偏移(而不是像我們之前看到的那樣顏色被裁剪)。

這僅是具有混合顏色強度通道的非線性色彩空間的問題,例如 sRGB 或 sigmoid 色彩空間。


非銳化調整大小 (USM)-- Photoshop 調整大小技術

通常調整圖像大小(無論是縮小還是放大)都會增加一些模糊度(模糊偽影)。因此,許多人喜歡嘗試各種濾鏡(請參閱重採樣濾鏡),以嘗試使結果更清晰。但这可能会给图像结果添加其他调整大小偽影。常用的方法是在调整大小后锐化图像。通常,这是使用特殊且命名奇怪的非锐化操作来完成的,该操作包含更多控件来控制结果的质量。例如,让我们“不锐化”非常模糊的“Spline”过滤图像的结果...

  magick logo: -filter spline -resize 150x logo_spline.png
  magick logo: -filter spline -resize 150x \
          -unsharp 0x1  logo_spline_unsharp.png
[IM Output]
Spline
==> [IM Output]
非锐化
如您所见,在调整大小后锐化图像可以改善结果。特别是看星星和帽子的细节。您可以获得一张非常清晰的图像,没有任何锯齿、振铃甚至暗化效果。虽然Spline 滤镜本身并不是特别好的滤镜,但这种锐化(实际上是“非锐化”)方法适用于任何滤镜。它还提供了更多控件来微调结果。实际上,这就是“photoshop”用来提高其调整大小后的图像质量的方法,但我不知道它对非锐化操作使用什么设置。一种称为 USM 的技术“GIMP”的默认值(半径=6,数量=0.5,阈值=0)相当于“-unsharp 12x6+0.5+0”,这是正确的(除了忽略 GIMP 将硬半径设置为两倍 sigma 之外)。但是请记住,您确实不需要在 ImageMagick 中指定内核半径,因此值“-unsharp 0x6+0.5+0”会更好地工作。另请参阅 IM 论坛主题GIMP 中的非锐化参数。帖子图像大小调整建议使用“-unsharp 0x0.75+0.75+0.008”,因为它适用于大于 500 像素的图像。而开放摄影论坛讨论使用 ImageMagick 进行缩减采样建议使用“-unsharp 1.5x1+0.7+0.02”。

调整大小以填充给定空间

基本上:将大图像调整大小以完全填充特定的图像大小,但裁剪任何不适合的图像部分。
从 IM v6.3.8-3 开始,新的调整大小标志“^”将允许您直接执行此操作,作为单个调整大小步骤。这些示例代表了一种替代方法,可供使用旧版本 IM 的用户使用。请参阅上面的调整大小填充标志
解决方案相当棘手,因为用户在调整图像大小时的正常要求是将整个图像放入给定的大小。由于保留了图像的纵横比,因此您尝试填充的区域中会留有多余的未使用空间。在这里,我们尝试调整图像大小以填充 80x80 的框。

  magick logo: -resize 80x80\> \
          -size 80x80 xc:blue +swap -gravity center  -composite \
          space_resize.jpg
[IM Output]
在上面,我們添加了一個背景畫布,以填充 resize 方塊中未使用的部分,以顯示我們希望圖像填充的空間,但它沒有被填充,因為它保留了圖像的縱橫比。現在,如果您的所有圖像都是橫向樣式(它們的寬度大於高度),那麼您當然可以調整圖像大小以適應區域的高度或寬度,然後使用“-crop”來裁剪圖像以使其完全適合。

  magick logo:    -resize x80  \
          -gravity center  -crop 80x80+0+0 +repage   space_crop.jpg
[IM Output]
問題是,以上內容僅適用於橫向樣式的圖像。如果圖像為縱向樣式(高度大於寬度),則會嚴重失敗。當然,這可以在腳本中通過首先獲取圖像的尺寸,然後選擇正確的方法將圖像擬合到所需的空間來解決。但更好的解決方案是讓 IM 為所有圖像完成所有工作。 IM 中的解決方案是分別調整每個圖像尺寸的大小來處理圖像。然後選擇兩個結果中較大的圖像。為了簡化此操作,resize 本身具有一個內置的測試選項,該選項僅在調整圖像大小會使圖像變大時才調整圖像大小。這允許我們為問題找到一個非常巧妙的解決方案。

  magick logo: \
          -resize x160 -resize '160x<'   -resize 50% \
          -gravity center  -crop 80x80+0+0 +repage  space_fill.jpg
[IM Output]
在上面的示例中,如果第一次調整大小產生的寬度小於我們要填充的區域,則只會進行第二次調整大小。選擇調整大小的特定順序(先高度,然後寬度),因為大多數圖像都是照片,通常水平方向更長。使用上述順序,這種情況將導致跳過第二次調整大小操作。如果您的圖像更常是縱向圖像(垂直方向更長),則更改參數以先調整圖像的高度,然後再調整寬度。例如...

  magick logo: \
          -resize 160x -resize 'x160<'   -resize 50% \
          -gravity center  -crop 80x80+0+0 +repage   space_fill_2.jpg
[IM Output]
這兩個示例的結果應該非常相似,並且該命令適用於橫向和縱向樣式的圖像,儘管它對一種樣式的效果更好。這種方法的最大問題是圖像現在被調整了 2 到 3 次大小,從而在最終結果中產生了額外的模糊和其他可能的偽影。為了減少這種情況,初始調整大小以最終尺寸的兩倍執行,這假設原始圖像至少是最終所需結果的 3 倍或更多。對於縮略圖製作來說這不是問題,但要牢記這一點。

調整線條圖的大小

對包含細線的圖像進行強調整大小可能會帶來很大的問題……將圖像調整為非常小的縮略圖會導致僅幾像素寬的細線淡化並消失在背景中。這可能會變得非常糟糕,以至於我見過看起來完全空白的線條圖縮略圖!也就是說,原始圖紙的每個細節都“消失了”,使得縮略圖毫無用處。如果這是問題,有一些技術可以提供幫助...
  • 調整大小然後調整對比度以使線條更清晰可見。儘管這會使線條更加鋸齒狀(呈階梯狀)。這種技術的使用範圍也有限制。
  • 模糊圖像並設定閾值(一種與形態學“膨脹”或“侵蝕”非常相似的方法),以便使單像素線條加粗約 300%。現在,在將圖像縮小 1/3 後,圖像會變小,但線條會像以前一樣清晰可見。
  • 使用加粗形態技術加粗線條。您可能希望分階段調整大小,一次加粗和調整圖像大小 50%,直到達到最終大小。但是,隨著線條之間的間距縮小,您可能會發現您最終得到的不是線條圖,而更像是一個“斑點”。也就是說,您可能會遇到相反的問題。然而,調整加粗與調整大小的比例應該會產生可接受的結果。
  • 將圖像中的線條邊緣與純色區域分開,並使用不同的方法調整每個區域的大小(使用上述方法調整線條)。之後,這兩部分可以再次合併在一起,從而可以保留圖像的線條邊緣。這實際上會重現您在調整矢量圖像大小時經常看到的效果。
  • 將圖像轉換為向量圖,然後調整大小。這可能很棘手,但也可能為調整線條繪圖的大小產生最佳效果,具有完美的抗鋸齒(銳利)邊緣和清晰的圖像。
如果您想出其他有效調整線條繪圖大小的方法,或者嘗試了上述一些技術,請告訴我(和其他 IM 用戶)。