Как открыть специфическую часть рисунка.png в терминале Ubuntu?

Ситуация: начать просмотр фигур с шириной 1:960 и высотой в Терминале
Мотивация: средство просмотра изображений Ubuntu по умолчанию открывает фигуру на всю ширину и на всю высоту, что затрудняет просмотр очень широких фигур; его CTRL + - полной картинки недостаточно, когда вы перебираете много картинок, где ширина х высота
Дифференциальные условия: настроить яркость-контраст в плоскости с помощью Gimp / ImageMagick /…?,... Разрешение изображения как ширина х высота и поля в пикселях на каждой итерации

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://Ask-ubuntu.ru/a/803012/25388
  • Фиктивные тестовые данные разрешения изображения 960x1920 на 2-й итерации, 960x4800 на 5-й итерации, 960x8640 на 9-й итерации и разрешения 960x9600 на 10-й итерации соответственно

Мой псевдокод

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

Вывод: некоторый запас вокруг данных всегда

Проверка комментария Утигера на попытку отсутствия полей с 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 пикселя во всех направлениях, левое поле обрезает информацию из чисел>= 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"
Другие вопросы по тегам