Jak wstawić białe znaki za pomocą imagemagick?

13

Jakie parametry musi „przekonwertować” (?), Aby uzyskać to WYJŚCIE z tego WEJŚCIA?

WEJŚCIE:

wprowadź opis zdjęcia tutaj

WYNIK:

wprowadź opis zdjęcia tutaj

Gasko Peter
źródło

Odpowiedzi:

8

Ponieważ nie chciałem, aby obrazy były zrównane z prawą stroną, musiałem zastosować inne podejście ( compositenarzędzie ImageMagick ):

convert -size 500x500 xc:white canvas.png
convert canvas.png in.png -geometry +200+200 -composite out.png

-sizepowinien być ostatecznym rozmiarem obrazu, który chcesz, canvas.pngjest pustym białym płótnem, in.pngobrazem, który chcesz wypełnić, i -geometryjest przesunięciem pozycjonowania.

mustafa.0x
źródło
15

Moja wersja ImageMagick to „6.7.8-0 2012-07-04 Q16”. Według docu odpowiedź polecenia @kev powinna działać:

 convert in.png -gravity east -extent 520x352 out.png

Jednak, podobnie jak w przypadku większości pytań dotyczących ImageMagick, możesz osiągnąć ten sam cel różnymi środkami. Możesz użyć montagetego w następujący sposób:

 montage null: in.png -tile 2x1 -geometry +17+0 out1.png

Wykorzystuje to specjalny obraz „null:” do połączenia go z plikiem in.png.


Prawdą jest, że wraz z convertkoniecznością ponownego obliczenia wartości, które należy przekazać -extentdla każdego obrazu wejściowego o innym rozmiarze.

Najpierw użyj, identify -formataby uzyskać wymiary obrazu:

 identify -format '%Wx%H' in.png

Powinno to zwrócić coś takiego:

 449x352

Ok, teraz musisz dodać 71 pikseli, aby uzyskać końcową 520x352wartość. Ale nie musisz wykonywać tych obliczeń we własnych mózgach:

ImageMagick na ratunek !, i jego magiczne możliwości obliczeniowe ... :-)

Możesz nakazać identify -formatkomuś wykonanie obliczeń:

 identify -format '%[fx:W+71]x%H'

To powinno dać ci wynik:

 520x352

Zakładając, że chcesz po prostu wstawić / dodać „biały pasek” o szerokości 71 pikseli po lewej stronie dowolnego obrazu, możesz użyć następującej pojedynczej linii poleceń:

 convert \
    in.png \
   -gravity east \
   -background white \
   -extent $(identify -format '%[fx:W+71]x%H' in.png) \
    out2.png

Voila! Jedna linia poleceń (która, szczerze mówiąc, zawiera 2 polecenia), i możesz pozwolić temu poluzować wszystkie PNG, JPEG, GIF, ... w katalogu, aby automatycznie magicznie dodać biały pasek 71 pikseli do każdego z nich:

 for i in *.png *.jpeg *jpg *.gif; do
    convert \
       ${i} \
      -gravity east \
      -background white \
      -extent $(identify -format '%[fx:W+71]x%H' ${i}) \
       $(convert ${i} -format "71-pixels-padded-left---%t.%e" info:)
 done

Dla każdego obrazu jego wyjście pozostaje tego samego typu pliku. Oczywiście możesz wymusić zapisywanie wszystkich danych wyjściowych jako PNG (lub cokolwiek chcesz). Po prostu zamień %t.%eczęść polecenia na %t.png...

Kurt Pfeifle
źródło
7

Dokumentacja: http://www.imagemagick.org/Usage/crop/#extent

convert in.png -gravity east -extent 500x352 out.png
kev
źródło
Dzięki!! Ale co jeśli moje zdjęcie nie ma rozmiaru 500 x 352 - ponieważ rozmiar jest różny?
gasko peter
1
Po prostu pokażę ci, jak to zrobić.
kev
@kev: Twoje polecenie nie robi dokładnie tego, czego chciał @gasko Peter. Powinieneś był użyć -extend 520x352. +1 za „właściwy kierunek” :-P
Kurt Pfeifle,
sed 's # -extend # -extent # g'
Kurt Pfeifle
Musiałem dodać, -background transparentaby zachować przezroczyste tło.
tremby
0

Mam to polecenie zdefiniowane w moim .bash_profile. Automatycznie obliczy ostateczny rozmiar obrazu na podstawie wypełnienia, którego chcesz szerokość i wysokość (działa z zerami):

# arithmetic with awk
calc() { awk "BEGIN { print $* }"; }

# pad an image
img_pad() {
    local width height pw ph 
    [ $# -lt 3 ] && { echo "Usage: img_pad <Input> <WxH> <Output>"; return; }

    # parse current size and padding
    IFS=x read width height <<< "$(identify "$1" | awk '{print $3}')"
    IFS=x read pw ph <<< "$2"

    # new widht and height
    width=$(calc "$width + 2*$pw")
    height=$(calc "$height + 2*$ph")

    echo "Converting '$1' to '$3' with size ${width}x${height} (+w=${pw}, +h=${ph})."
    convert "$1" -gravity center -extent "${width}x${height}" "$3"
}

Przykładowe użycie:

# pad 50px left and right, no vertical padding
img_pad in.png 50x0 out.png 
Sheljohn
źródło