Imagemagick 最大颜色和缩放
Imagemagick maximum colors and scaling
我正在尝试将 80x80 图像转换为 2bpp 灰度的 56x56 图像。
80x80 图像是彩色的,其中可能有多达 16 种颜色。它们也有透明背景。
我需要用 4 种颜色进行灰度化处理,白色最亮,黑色最暗。
每张图片都有多种颜色,但每种颜色都有 3 种颜色的调色板,深色、中色和浅色。
我需要将所有深色转换为深灰色,将中等颜色转换为浅灰色,将浅色转换为白色,同时保持图像中已有的黑色。
我可以成功将图像转换为灰度,trim canvas,并使用此命令填充背景
convert input.png +dither -flatten -trim -set colorspace Gray -
separate -average output.png
现在我需要限制颜色,但它没有转换正确的颜色。浅色正在转换为浅灰色而不是白色。当我更改 -level 选项时,它仅适用于部分图像。
-auto-levels 也不符合我的要求。
有没有办法设置中频的颜色自动调平以满足我的要求?如果我解释得不够充分,我很抱歉。
这是我一直在篡改的代码,但它只适用于少数图像。使用 gamma 选项可以使其适用于更多图像,但会破坏原始工作图像。
convert "$f" +dither -flatten -trim -set colorspace Gray -separate -
average -gamma 1.37 -level 25%,75% -colors 4 -adaptive-resize 56x56\>
-background white -gravity center -extent 56x56 -remap nido.png
"${f%.png}".png2
我无法提供预期的图片,但可以提供与预期类似的图片。这是原图https://img.pokemondb.net/sprites/black-white/normal/charizard.png and here is desired output format image https://img.pokemondb.net/sprites/red-blue/normal/charizard.png
这是我目前所知道的
https://www.pokecommunity.com/showthread.php?p=9692599#post9692599
convert "$f" +dither -background white -flatten -trim -adaptive-resize
56x56\> "${f%.png}".png2
convert "${f%.png}".png2 +dither -colorspace gray -separate -average
"${f%.png}".png2
convert "${f%.png}".png2 +dither -gamma 3.0 -black-threshold 70%
"${f%.png}".png2
convert "${f%.png}".png2 +dither -gamma 0.45 -white-threshold 90%
"${f%.png}".png2
convert "${f%.png}".png2 +dither -remap nidoking.png -background white
-gravity center -extent 56x56 "${f%.png}".png2
顺便说一句,^ 在 for 循环中,因此是变量。更改 gamme 和 black/white 阈值让我更接近,但它非常乏味,当我得到一个图像以正确转换另一个中断时。 nidoking.png 是我的重映射文件。重新映射非常完美,就在重新映射之前,颜色被正确分离或过滤。
Solved, thanks to Mark Setchell
这就是我最后做的事情
#!/bin/bash
rm x*
rm colors*
cd images
rm *.png2
rm *.txt
for f in *.png
do
#Fitting canvas to image, setting background color, and removing transparency
convert "$f" +dither -background white -flatten -trim "${f%.png}".png2
#Converting image to greyscale
convert "${f%.png}".png2 +dither -colorspace gray -separate -average "${f%.png}".png2
#Resizing without blurring/adding pixels
convert "${f%.png}.png2" +dither -interpolate Nearest -interpolative-resize 56x56\> "${f%.png}".png2
#Grabbing every color used in image and putting it in a text file
convert "${f%.png}.png2" txt: | sed '1d' | cut -f 4 -d " " | sort -u > "${f%.png}".txt
done
#Putting all colors into one file
cat *.txt >> ../colors
cd ../
#One last clean up of file/sorting
cat colors | tr " " "\n" | sort -u > colors.txt
rm colors
#Splitting the hex codes into four files for each desired color
file=colors.txt
lines=$(wc -l <${file})
((lpp = (lines + 4 - 1) / 4))
split --lines=${lpp} ${file}
#Going back to images directory
cd images
for f in *.png
do
#Each while loop reads everyone line of the specified file and puts it in variable $i, then I use $i to convert to one of the desired 4 colors.
cat ../xaa | while read i
do
convert "${f%.png}".png2 +dither -fuzz 0% -fill "#000000" -opaque "${i}" "${f%.png}".png2
done
cat ../xab | while read i
do
convert "${f%.png}".png2 +dither -fuzz 0% -fill "#555555" -opaque "${i}" "${f%.png}".png2
done
cat ../xac | while read i
do
convert "${f%.png}".png2 +dither -fuzz 0% -fill "#AAAAAA" -opaque "${i}" "${f%.png}".png2
done
cat ../xad | while read i
do
convert "${f%.png}".png2 +dither -fuzz 0% -fill "#FFFFFF" -opaque "${i}" "${f%.png}".png2
done
mv "${f%.png}".png2 ../finished/"${f}"
done
这个脚本把这个
进入这个
基本上,想法是在 RGB 色彩空间(而不是灰度色彩空间)中减少到 4 种颜色以获得最佳的四种颜色。然后获取每一个的亮度,将最暗的映射为黑色,将次浅的映射为深灰色,将次浅的映射为浅灰色,将最亮的映射为白色。
此处它映射到 RGB 色彩空间中的 4 种最佳颜色:
没有太多错误检查或特殊情况处理的代码如下所示:
#!/bin/bash -x
# Do a colour reduction to get best 4 colours in RGB colourspace rather than in grey colourspace
magick pokething.png -alpha off +dither -colors 5 -unique-colors unique.png
# Get hex colours into array "hexcolours[]"
hexcolours=( $(convert unique.png txt: | awk 'NR>1{print }') )
echo DEBUG: hexcolours=${hexcolours[@]}
# Get lightness of each colour into array "lightness[]", i.e. H of HSL
# Note ggrep is just GNU grep
lightness=( $(convert unique.png -colorspace HSL -separate -delete 0,1 txt: | ggrep -Po "\d+(?=\)$)") )
echo DEBUG: lightness=${lightness[@]}
# Sort the colours by their lightness
fourshades=( $(for ((i=0;i<4;i++)) ;do
echo ${lightness[i]} ${hexcolours[i]}
done | sort -n | awk '{print }') )
echo DEBUG: fourshades=${fourshades[@]}
# Now change those colours in original image
magick pokething.png -alpha off +dither -colors 5 -fuzz 10% \
-fill black -opaque "${fourshades[0]}" \
-fill gray25 -opaque "${fourshades[1]}" \
-fill gray75 -opaque "${fourshades[2]}" \
-fill white -opaque "${fourshades[3]}" \
result.png
输出结果如下:
DEBUG: hexcolours=#000000 #094152 #A95244 #EF9E3C
DEBUG: lightness=0 46 119 150
DEBUG: fourshades=#000000 #094152 #A95244 #EF9E3C
这导致执行:
magick pokething.png -alpha off +dither -colors 5 -fuzz 10% \
-fill black -opaque '#000000' \
-fill gray25 -opaque '#094152' \
-fill gray75 -opaque '#A95244' \
-fill white -opaque '#EF9E3C' result.png
所以,基本上我将 #094152 替换为深灰色,因为 46 是目前第二深的颜色。然后我将 #A95244 替换为浅灰色,因为 119 是下一个较浅的颜色,然后将 #EF9E3C 替换为白色,因为这是最浅的颜色。
您几乎可以只使用“-remap”来获得想要的结果。此示例将从白色、65% 灰色、35% 灰色和黑色制作一个四色地图,并将该地图写入临时内存。接下来,它会读取您的输入图像,将背景设置为白色,并展平图像。然后它关闭抖动,将输入图像重新映射到您创建的地图,然后 returns 结果。
convert xc:white xc:gray65 xc:gray35 xc:black -append -write mpr:map +delete \
input.png -background white -flatten +dither -remap mpr:map output.png
当然,您应该在重新映射之前进行任何调整大小、裁剪等操作。您可能不需要先将其转为灰度,因为地图没有颜色。
我正在尝试将 80x80 图像转换为 2bpp 灰度的 56x56 图像。
80x80 图像是彩色的,其中可能有多达 16 种颜色。它们也有透明背景。
我需要用 4 种颜色进行灰度化处理,白色最亮,黑色最暗。
每张图片都有多种颜色,但每种颜色都有 3 种颜色的调色板,深色、中色和浅色。
我需要将所有深色转换为深灰色,将中等颜色转换为浅灰色,将浅色转换为白色,同时保持图像中已有的黑色。
我可以成功将图像转换为灰度,trim canvas,并使用此命令填充背景
convert input.png +dither -flatten -trim -set colorspace Gray -
separate -average output.png
现在我需要限制颜色,但它没有转换正确的颜色。浅色正在转换为浅灰色而不是白色。当我更改 -level 选项时,它仅适用于部分图像。
-auto-levels 也不符合我的要求。
有没有办法设置中频的颜色自动调平以满足我的要求?如果我解释得不够充分,我很抱歉。
这是我一直在篡改的代码,但它只适用于少数图像。使用 gamma 选项可以使其适用于更多图像,但会破坏原始工作图像。
convert "$f" +dither -flatten -trim -set colorspace Gray -separate -
average -gamma 1.37 -level 25%,75% -colors 4 -adaptive-resize 56x56\>
-background white -gravity center -extent 56x56 -remap nido.png
"${f%.png}".png2
我无法提供预期的图片,但可以提供与预期类似的图片。这是原图https://img.pokemondb.net/sprites/black-white/normal/charizard.png and here is desired output format image https://img.pokemondb.net/sprites/red-blue/normal/charizard.png
这是我目前所知道的 https://www.pokecommunity.com/showthread.php?p=9692599#post9692599
convert "$f" +dither -background white -flatten -trim -adaptive-resize
56x56\> "${f%.png}".png2
convert "${f%.png}".png2 +dither -colorspace gray -separate -average
"${f%.png}".png2
convert "${f%.png}".png2 +dither -gamma 3.0 -black-threshold 70%
"${f%.png}".png2
convert "${f%.png}".png2 +dither -gamma 0.45 -white-threshold 90%
"${f%.png}".png2
convert "${f%.png}".png2 +dither -remap nidoking.png -background white
-gravity center -extent 56x56 "${f%.png}".png2
顺便说一句,^ 在 for 循环中,因此是变量。更改 gamme 和 black/white 阈值让我更接近,但它非常乏味,当我得到一个图像以正确转换另一个中断时。 nidoking.png 是我的重映射文件。重新映射非常完美,就在重新映射之前,颜色被正确分离或过滤。
Solved, thanks to Mark Setchell
这就是我最后做的事情
#!/bin/bash
rm x*
rm colors*
cd images
rm *.png2
rm *.txt
for f in *.png
do
#Fitting canvas to image, setting background color, and removing transparency
convert "$f" +dither -background white -flatten -trim "${f%.png}".png2
#Converting image to greyscale
convert "${f%.png}".png2 +dither -colorspace gray -separate -average "${f%.png}".png2
#Resizing without blurring/adding pixels
convert "${f%.png}.png2" +dither -interpolate Nearest -interpolative-resize 56x56\> "${f%.png}".png2
#Grabbing every color used in image and putting it in a text file
convert "${f%.png}.png2" txt: | sed '1d' | cut -f 4 -d " " | sort -u > "${f%.png}".txt
done
#Putting all colors into one file
cat *.txt >> ../colors
cd ../
#One last clean up of file/sorting
cat colors | tr " " "\n" | sort -u > colors.txt
rm colors
#Splitting the hex codes into four files for each desired color
file=colors.txt
lines=$(wc -l <${file})
((lpp = (lines + 4 - 1) / 4))
split --lines=${lpp} ${file}
#Going back to images directory
cd images
for f in *.png
do
#Each while loop reads everyone line of the specified file and puts it in variable $i, then I use $i to convert to one of the desired 4 colors.
cat ../xaa | while read i
do
convert "${f%.png}".png2 +dither -fuzz 0% -fill "#000000" -opaque "${i}" "${f%.png}".png2
done
cat ../xab | while read i
do
convert "${f%.png}".png2 +dither -fuzz 0% -fill "#555555" -opaque "${i}" "${f%.png}".png2
done
cat ../xac | while read i
do
convert "${f%.png}".png2 +dither -fuzz 0% -fill "#AAAAAA" -opaque "${i}" "${f%.png}".png2
done
cat ../xad | while read i
do
convert "${f%.png}".png2 +dither -fuzz 0% -fill "#FFFFFF" -opaque "${i}" "${f%.png}".png2
done
mv "${f%.png}".png2 ../finished/"${f}"
done
这个脚本把这个
进入这个
基本上,想法是在 RGB 色彩空间(而不是灰度色彩空间)中减少到 4 种颜色以获得最佳的四种颜色。然后获取每一个的亮度,将最暗的映射为黑色,将次浅的映射为深灰色,将次浅的映射为浅灰色,将最亮的映射为白色。
此处它映射到 RGB 色彩空间中的 4 种最佳颜色:
没有太多错误检查或特殊情况处理的代码如下所示:
#!/bin/bash -x
# Do a colour reduction to get best 4 colours in RGB colourspace rather than in grey colourspace
magick pokething.png -alpha off +dither -colors 5 -unique-colors unique.png
# Get hex colours into array "hexcolours[]"
hexcolours=( $(convert unique.png txt: | awk 'NR>1{print }') )
echo DEBUG: hexcolours=${hexcolours[@]}
# Get lightness of each colour into array "lightness[]", i.e. H of HSL
# Note ggrep is just GNU grep
lightness=( $(convert unique.png -colorspace HSL -separate -delete 0,1 txt: | ggrep -Po "\d+(?=\)$)") )
echo DEBUG: lightness=${lightness[@]}
# Sort the colours by their lightness
fourshades=( $(for ((i=0;i<4;i++)) ;do
echo ${lightness[i]} ${hexcolours[i]}
done | sort -n | awk '{print }') )
echo DEBUG: fourshades=${fourshades[@]}
# Now change those colours in original image
magick pokething.png -alpha off +dither -colors 5 -fuzz 10% \
-fill black -opaque "${fourshades[0]}" \
-fill gray25 -opaque "${fourshades[1]}" \
-fill gray75 -opaque "${fourshades[2]}" \
-fill white -opaque "${fourshades[3]}" \
result.png
输出结果如下:
DEBUG: hexcolours=#000000 #094152 #A95244 #EF9E3C
DEBUG: lightness=0 46 119 150
DEBUG: fourshades=#000000 #094152 #A95244 #EF9E3C
这导致执行:
magick pokething.png -alpha off +dither -colors 5 -fuzz 10% \
-fill black -opaque '#000000' \
-fill gray25 -opaque '#094152' \
-fill gray75 -opaque '#A95244' \
-fill white -opaque '#EF9E3C' result.png
所以,基本上我将 #094152 替换为深灰色,因为 46 是目前第二深的颜色。然后我将 #A95244 替换为浅灰色,因为 119 是下一个较浅的颜色,然后将 #EF9E3C 替换为白色,因为这是最浅的颜色。
您几乎可以只使用“-remap”来获得想要的结果。此示例将从白色、65% 灰色、35% 灰色和黑色制作一个四色地图,并将该地图写入临时内存。接下来,它会读取您的输入图像,将背景设置为白色,并展平图像。然后它关闭抖动,将输入图像重新映射到您创建的地图,然后 returns 结果。
convert xc:white xc:gray65 xc:gray35 xc:black -append -write mpr:map +delete \
input.png -background white -flatten +dither -remap mpr:map output.png
当然,您应该在重新映射之前进行任何调整大小、裁剪等操作。您可能不需要先将其转为灰度,因为地图没有颜色。