如何在 Ubuntu 的终端中打开 .png 图片的特定部分?

如何在 Ubuntu 的终端中打开 .png 图片的特定部分?

情况:在终端中开始浏览宽度为 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"

尝试使用不稳定的边距displayextract

whtyger 的代码可以工作,但是它有一些不稳定的边缘,即它们的大小根据图像而不同,这里是第 5 次迭代

在此处输入图片描述 在此处输入图片描述

  • 在右侧图片中,您会看到颜色条上的并非所有文本都包含在输出中。
  • 在左侧的图片中,您会看到 margin_left 不等于 margin_top。

原因:,,,MARGIN_T修复: 使用科学计数法进行更大的迭代或增加;代码中的一些调整 MARGIN_BMARGIN_LMARGIN_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=6690Y=960-70-100=790,即6690x790
现在我们将结合-geometry-extract选项来生成输出:

display -geometry 500x500 -extract 6690x790+1070+70 raw.png

(将输出窗口的大小设置为 500x500,将图像裁剪为新尺寸 6690x790,并将裁剪区域从图像左上角水平移动 1070px,垂直移动 70px)。

这是我得到的(为了更清晰,我将选择移到了右边):

分段

所有这些计算都有点繁琐,但如果您有静态边距(您的图像似乎是自动生成的),那么您可以计算一次并应用于所有图像。或者甚至可以编写一些脚本来自动执行此操作(这是脚本的改进版本 - 它使用identifyImageMagick 命令计算迭代):

#!/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"

相关内容