web-dev-qa-db-fra.com

Comment ouvrir une partie spécifique de la figure .png dans le terminal d'Ubuntu?

Situation: commencer à parcourir les chiffres à la largeur 1: 960 et à la hauteur complète dans le terminal
Motivation: la visionneuse d'images par défaut d'Ubuntu ouvre la figure à pleine largeur et pleine hauteur , ce qui rend difficile la navigation sur des figures très larges; son CTRL + - de l'image complète ne suffit pas lorsque vous parcourez de nombreuses images où largeur x hauteur
Conditions différentielles: Pour régler le contraste de luminosité dans le plan avec Gimp/ImageMagick /…? , ... Résolution d'image sous la forme Largeur x Hauteur et marges en pixels à chaque itération

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
  • Données de test factices de la résolution d'image 960x1920 à la 2e itération, 960x4800 à la 5e itération, 960x8640 à la 9e itération et la résolution 960x9600 à la 10e itération, respectivement

    enter image description hereenter image description hereenter image description hereenter image description here

Mon pseudocode

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

Tentative avec des marges instables avec display et extract

le code de whtyger fonctionne mais il a des marges instables c'est à dire que leur taille diffère en fonction de l'image, ici 5ème itération

enter image description hereenter image description here

  • Dans l'image de droite, vous voyez que tout le texte de la barre de couleurs n'est pas inclus dans la sortie.
  • Sur l'image de gauche, vous voyez que margin_left n'est pas égal à margin_top.

Raison: MARGIN_T, MARGIN_B, MARGIN_L, MARGIN_R
Correction: utilisez la numérotation scientifique avec des itérations plus grandes ou augmentez MARGIN_R; quelques ajustements dans le code

MARGIN_T=60
MARGIN_B=90
MARGIN_L=$(( -5 + $ITER * 119 ))
MARGIN_R=$(( -20 + $ITER * 95 ))

Sortie: une certaine marge autour des données toujours

Examen du commentaire de whtyger pour une tentative d'absence de marges avec convert et crop

Pour vous débarrasser complètement des marges, vous pouvez modifier l'image d'origine. Utilisez convert image.png -crop SIZE_XxSIZE_Y + SHIFT_X + SHIFT_Y> modified.png, puis utilisez la visionneuse de votre choix. Vous pouvez adapter mon script pour cela, il suffit de remplacer display + -extract par convert + -crop.

Je remplace la dernière ligne par la sortie suivante mais infructueuse

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"

Sortie: environ 1 px de marge dans toutes les directions, la marge de gauche coupe quelques informations à partir de nombres> = 1000.

Système: Linux Ubuntu 16.04 64 bits
Matériel: Macbook Air 2013-mid

Il existe une puissante suite d'images appelée ImageMagick. Parmi ses outils, vous trouverez un utilitaire display, qui est utilisé, comme son nom l'indique, pour afficher différents formats graphiques à partir de la console. Voici plusieurs exemples de son utilisation:

display -geometry 500x500 image.png

Cela ouvrira votre image dans la fenêtre avec la taille sélectionnée. De plus, une petite fenêtre représentant l'image complète sera ouverte à proximité, vous pouvez donc déplacer le rectangle de sélection pour afficher les parties souhaitées de votre image.

display -extract 300x300+50+50 image.png

Cette commande vous montrera la partie de votre image avec la taille de 300x300 pixels et avec le décalage de 50 pixels à partir de son coin supérieur gauche.

Vous pouvez trouver la liste complète de ses options dans man display. Il y a aussi un manuel complet ici .

ImageMagick fournit également d'autres outils utiles. Par exemple, cela affichera les informations sur l'image (son type, ses dimensions, sa taille):

identify "my image.png"

Afin d'afficher votre image sans les marges, nous devons les mesurer pour les recadrer plus tard. J'ai ouvert votre image factice dans Gimp pour accélérer les choses. Les marges sont donc:

Left   - 1070px
Right  -  880px
Top    -   70px
Bottom -  100px

Si la taille d'origine de votre photo est 8640x960 alors la taille de l'image sans les marges sera: X=8640-1070-880=6690 et Y=960-70-100=790, c'est à dire. 6690x790.
Et maintenant, nous allons combiner -geometry et -extract options pour produire la sortie:

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

(définissez la taille de la fenêtre de sortie sur 500x500, recadrez l'image à la nouvelle taille 6690x790 et déplacez la zone de recadrage de 1070 pixels horizontalement et de 70 pixels verticalement à partir du coin supérieur gauche de l'image).

Voici ce que j'ai (j'ai déplacé la sélection vers la droite pour plus de clarté):

Fragment

Tous ces calculs sont un peu fastidieux, mais si vous avez des marges statiques (il semble que vos images soient produites automatiquement), vous pouvez les calculer une fois et les appliquer à toutes vos images. Ou même créez un script pour automatiser cela (c'est une version améliorée du script - il calcule l'itération en utilisant la commande identify d'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"

Enregistrez ce script sous le nom reviewimage quelque part. Exécutez ensuite les commandes ci-dessous:

Sudo cp reviewimage /usr/local/bin/
Sudo chmod 755 /usr/local/bin/reviewimage

Vous pouvez maintenant appeler cette commande à partir de chaque dossier contenant vos images. Par exemple, pour ouvrir un aperçu de votre image raw10.png avec la taille de 700x700:

reviewimage 700 raw10.png

Si le nom contient des espaces, utilisez des guillemets:

reviewimage 700 "raw 2.png"

Si la formule de calcul de la marge devient imprécise avec des itérations élevées, vous pouvez utiliser un tableau de valeurs de marge. Ajustez chaque valeur de marge comme bon vous semble. Le script ci-dessous montre le principe. Il est rempli avec les valeurs pour les itérations 1-10, ajoutez plus à l'intérieur des crochets avec l'espace comme séparateur:

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

Ce script effectue le recadrage de l'image au lieu de l'afficher, de sorte que cette image convertie peut être affichée dans n'importe quel programme. Il n'a besoin que d'un paramètre - nom de l'image:

convertimage "raw 9.png"
3
whtyger