情况:在终端中开始浏览宽度为 1:960、高度为全屏的图形
动机:Ubuntu 的默认图像查看器以全屏打开图形宽度并且充满高度,使得浏览非常宽的图形变得困难;当你迭代许多图片时,它的全图CTRL
+-
是不够的宽度X高度
微分条件:使用 Gimp/ImageMagick/... 调整平面亮度对比度?, ... 图像分辨率为宽 x 高每次迭代的像素边距
Iteration Image Resolution Left Right Top Bottom
1 960 x 960 110 80 70 100
2 960 x 1920 230 180 70 100
3 960 x 2880 350 280 70 100
4 960 x 3840 470 380 70 100
5 960 x 4800 590 480 70 100
6 960 x 5760 710 580 70 100
7 960 x 6720 830 680 70 100
8 960 x 7680 950 780 70 100
9 960 x 8640 1070 880 70 100
10 960 x 9600 1190 980 70 100
% whtyger and Gimp use to find out the margins http://askubuntu.com/a/803012/25388
虚拟测试数据:第 2 次迭代时图像分辨率为 960x1920,第 5 次迭代时图像分辨率为 960x4800,第 9 次迭代时图像分辨率为 960x8640,第 10 次迭代时图像分辨率为 960x9600
我的伪代码
#!/bin/bash
OUTRES=$1
ITER=$2
IMAGE=$3
top=70
height=960
width=$(( 960*${ITER} ))
left=$(( 110+${ITER}*120 ))
right=$(( 80+${ITER}*100 ))
x=$(( ${width}-${left}-${right} ))
y=$(( ${height}-${bottom}-${top} ))
display -geometry ${OUTRES}x${OUTRES} \
-extract ${x}x${y}+${left}+${top} "$IMAGE"
尝试使用不稳定的边距display
和extract
whtyger 的代码可以工作,但是它有一些不稳定的边缘,即它们的大小根据图像而不同,这里是第 5 次迭代
- 在右侧图片中,您会看到颜色条上的并非所有文本都包含在输出中。
- 在左侧的图片中,您会看到 margin_left 不等于 margin_top。
原因:,,,MARGIN_T
修复: 使用科学计数法进行更大的迭代或增加;代码中的一些调整 MARGIN_B
MARGIN_L
MARGIN_R
MARGIN_R
MARGIN_T=60
MARGIN_B=90
MARGIN_L=$(( -5 + $ITER * 119 ))
MARGIN_R=$(( -20 + $ITER * 95 ))
输出:数据周围始终存在一定的余量
审查 whtyger 对没有边距的尝试的convert
评论crop
要完全消除边距,您可以修改原始图像。使用 convert image.png -crop SIZE_XxSIZE_Y+SHIFT_X+SHIFT_Y > edited.png,然后使用您喜欢的任何查看器。您可以为此修改我的脚本,只需将 display+-extract 替换为 convert+-crop。
我将最后一行替换为以下但不成功的输出
convert "$IMAGE" -crop ${EXTRACT_X}x${EXTRACT_Y}+${MARGIN_L}+${MARGIN_T} \
"${IMAGE%.png}_cropped.png"
display -geometry ${OUTRES}x${OUTRES}+${SHIFT}+${SHIFT} \
-extract ${EXTRACT_X}x${EXTRACT_Y}+${MARGIN_L}+${MARGIN_T} \
"${IMAGE%.png}_cropped.png"
rm "${IMAGE%.png}_cropped.png"
输出:所有方向上的边距约为 1 px,左边距从 >= 1000 的数字中删去一些信息。
系统:Linux Ubuntu 16.04 64位
硬件:Macbook Air 2013-mid
答案1
有一个功能强大的图像套件叫做 ImageMagick。在其工具中,您可以找到一个display
实用程序,从其名称就可以看出,它用于从控制台显示各种图形格式。以下是其用法的几个示例:
display -geometry 500x500 image.png
这将在窗口中以所选尺寸打开您的图像。此外,还会在附近打开一个代表完整图像的小窗口,因此您可以移动选择矩形以显示图像的所需部分。
display -extract 300x300+50+50 image.png
此命令将显示图像中大小为 300x300 像素且距左上角偏移 50 像素的部分。
您可以在以下位置找到其选项的完整列表man display
。此外,还有一本详尽的手册这里。
ImageMagick 还提供其他有用的工具。例如,这将显示有关图像的信息(其类型、尺寸、大小):
identify "my image.png"
为了显示没有边距的图像,我们应该测量它们以便稍后裁剪。我在 Gimp 中打开了您的虚拟图片以加快速度。因此边距为:
Left - 1070px
Right - 880px
Top - 70px
Bottom - 100px
如果您图片的原始尺寸为,8640x960
则不计边距的图像尺寸为:X=8640-1070-880=6690
和Y=960-70-100=790
,即6690x790
。
现在我们将结合-geometry
和-extract
选项来生成输出:
display -geometry 500x500 -extract 6690x790+1070+70 raw.png
(将输出窗口的大小设置为 500x500,将图像裁剪为新尺寸 6690x790,并将裁剪区域从图像左上角水平移动 1070px,垂直移动 70px)。
这是我得到的(为了更清晰,我将选择移到了右边):
所有这些计算都有点繁琐,但如果您有静态边距(您的图像似乎是自动生成的),那么您可以计算一次并应用于所有图像。或者甚至可以编写一些脚本来自动执行此操作(这是脚本的改进版本 - 它使用identify
ImageMagick 命令计算迭代):
#!/bin/bash
if [ $# -lt 2 ] ; then echo "usage: reviewimage output_resolution image_name" ; exit ; fi
OUTRES=$1
IMAGE=$2
# Some sanity or error checks, change as you see fit
if [ $OUTRES -lt 100 ] || [ $OUTRES -gt 1000 ] ; then echo "error: Invalid resolution" ; exit ; fi
if ! [ -e "$IMAGE" ] ; then echo "error: Image doesn't exist" ; exit ; fi
SHIFT=50 # Relative position of output window from top left corner of the desktop
IMAGE_X=$(identify "$IMAGE" | grep -o '[0-9]*x960 ' | cut -d'x' -f1)
IMAGE_Y=960
ITER=$(( $IMAGE_X / 960 ))
MARGIN_T=70
MARGIN_B=100
MARGIN_L=$(( -5 + $ITER * 119 ))
MARGIN_R=$(( -40 + $ITER * 102 ))
EXTRACT_X=$(( $IMAGE_X - $MARGIN_L - $MARGIN_R ))
EXTRACT_Y=$(( $IMAGE_Y - $MARGIN_T - $MARGIN_B ))
display -geometry ${OUTRES}x${OUTRES}+${SHIFT}+${SHIFT} -extract ${EXTRACT_X}x${EXTRACT_Y}+${MARGIN_L}+${MARGIN_T} "$IMAGE"
将此脚本保存在reviewimage
某处。然后运行以下命令:
sudo cp reviewimage /usr/local/bin/
sudo chmod 755 /usr/local/bin/reviewimage
raw10.png
现在,您可以从包含图像的每个文件夹调用此命令。例如,要打开大小为 的图像预览700x700
:
reviewimage 700 raw10.png
如果名称中有空格,请使用引号:
reviewimage 700 "raw 2.png"
如果边距计算公式在高迭代次数下变得不精确,则可以使用边距值数组。根据需要调整每个边距值。下面的脚本显示了原理。它填充了迭代 1-10 的值,在括号内添加更多值,并以空格作为分隔符:
#!/bin/bash
if [ $# -ne 1 ] ; then echo "usage: convertimage image_name" ; exit ; fi
if ! [ -e "$1" ] ; then echo "error: Image doesn't exist" ; exit ; fi
IMAGE=$1
IMAGE_X=$(identify "$IMAGE" | grep -o '[0-9]*x960 ' | cut -d'x' -f1)
IMAGE_Y=960
ITER=$(( $IMAGE_X / 960 ))
MARGIN_T=70
MARGIN_B=100
MARGIN_L=(0 114 233 352 471 590 709 828 947 1066 1185)
MARGIN_R=(0 80 180 280 380 480 580 680 780 880 980)
EXTRACT_X=$(( $IMAGE_X - ${MARGIN_L[$ITER]} - ${MARGIN_R[$ITER]} ))
EXTRACT_Y=$(( $IMAGE_Y - $MARGIN_T - $MARGIN_B ))
convert "$IMAGE" -crop ${EXTRACT_X}x${EXTRACT_Y}+${MARGIN_L[$ITER]}+${MARGIN_T} "${IMAGE%.png}_cropped.png"
此脚本对图像进行裁剪而不是显示,因此转换后的图像可以在任何程序中查看。它只需要一个参数 - 图像名称:
convertimage "raw 9.png"