convert - vágás + méretezés

Fórumok

Üdv!

Van egy olyan problémám, hogy egy képet szeretnék megadott méretűre alakítani, mondjuk 128x128- asra. Ez még így megy is:

 convert -resize 128x128! inp.jpg out.jpg 

Ezzel ugye semmi gond, csak torzítja a képet. Nekem arra lenne szükségem, hogy ne legyen torz a kép. A három együtt ugye nem oldható meg (mármint az, hogy 128x128- as legyen, ne legyen torz, és a teljes kép meglegyen az adott méretben.).

A méretnek mindenképpen egyeznie kell, a torzítás sem túl jó, viszont információ veszhet. Valószínűleg 2 esetet külön kell bontani az ábra szerint. Amikor a kép

x

mérete nagyobb, mint az

y

és fordítva (ha egyenlő, akkor tiszta ügy :- ) ).

Az ábrán látható "piros" megoldás érdekelne, tehát mindig a sarkoktól, de érdekességképpen a sárga is :- ).

Tudna valaki segíteni? Igazából a méreteket könnyen meg tudom szerezni identifyvel, de jó lenne ha egy converttel meg lehetne oldani az egészet (gyakran hívogatódna ez a kis shell script).

Köszi.

Hozzászólások

Megoldás a pirosra:
convert -crop 500x500 -scale 128x128 valamibe.jpg valamiki.jpg
Megoldás a sárgára:
convert -crop 500x500+0+100 -scale 128x128 valamibe.jpg valamiki.jpg
A +0 vízszintes eltolás +100 függőleges eltolás. Természetesen az oofset lehet negatív is. Az offset hatását a -gravity kapcsoló befolyásolja, de alapban a 0,0 koordináta morthwest azaz balfelső sarok a képen.

--
"Maradt még 2 kB-om. Teszek bele egy TCP-IP stacket és egy bootlogót. "

Szia!

Köszi, kipróbáltam, de igazából nem működik, nem tudom, hogy én rontottam- e el valamit, pedig kipróbáltam pár dolgot:


convert -crop 616x616 -scale 128x128 in.jpg out.jpg
$ identify *
in.jpg JPEG 816x616 DirectClass 150kb 0.010u 0:01
out.jpg[1] JPEG 128x97 DirectClass 13kb 0.000u 0:01

2 lépésben még úgy megoldható lenne, hogy először csak

 -crop 616x616 

, és utána

 -resize 128x128 

, de nem lehet valahogy összevonni a kettőt?

fisher@dudu:/tmp$ convert -crop 500x500+0+0 -scale 128x128 a.jpg b.jpg
fisher@dudu:/tmp$ identify *.jpg
a.jpg JPEG 800x1200 800x1200+0+0 8-bit DirectClass 98.8kb
b.jpg[1] JPEG 128x128 128x128+0+0 8-bit DirectClass 3.14kb

:)

Ha nem adsz meg offsetet akkor a crop huncut, és több képet is kivág a forrásból. De néha az a jó:

fisher@dudu:/tmp$ convert -crop 500x500 a.jpg b.jpg
fisher@dudu:/tmp$ identify *.jpg
a.jpg JPEG 800x1200 800x1200+0+0 8-bit DirectClass 98.8kb
b-0.jpg[1] JPEG 500x500 500x500+0+0 8-bit DirectClass 34.2kb
b-1.jpg[2] JPEG 300x500 300x500+0+0 8-bit DirectClass 19.2kb
b-2.jpg[3] JPEG 500x500 500x500+0+0 8-bit DirectClass 25.1kb
b-3.jpg[4] JPEG 300x500 300x500+0+0 8-bit DirectClass 12.1kb
b-4.jpg[5] JPEG 500x200 500x200+0+0 8-bit DirectClass 7.55kb
b-5.jpg[6] JPEG 300x200 300x200+0+0 8-bit DirectClass 7.08kb

Próbáltam én offsettel is, de így sem akarja az igazat:


guest@hho:/tmp/t$ ls -l   
total 156
-rw-r--r-- 1 guest guest 153595 2009-10-02 10:36 a.jpg
guest@hho:/tmp/t$ identify a.jpg    
a.jpg JPEG 816x616 DirectClass 150kb 
guest@hho:/tmp/t$ convert -crop 500x500+0+0 -scale 128x128 a.jpg b.jpg   
guest@hho:/tmp/t$ ls -l   
total 172
-rw-r--r-- 1 guest guest 153595 2009-10-02 10:36 a.jpg
-rw-r--r-- 1 guest guest  12952 2009-10-02 10:37 b.jpg
guest@hho:/tmp/t$ identify *   
a.jpg JPEG 816x616 DirectClass 150kb 
b.jpg[1] JPEG 128x97 DirectClass 13kb 
guest@hho:/tmp/t$ 

Kipróbáltam 2 gépen is, egy debian sarge- n, és egy etchen. Verziók:


Version: ImageMagick 6.0.6 01/28/06 Q16 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2004 ImageMagick Studio LLC

, ill.:


Version: ImageMagick 6.2.4 02/10/07 Q16 http://www.imagemagick.org
Copyright: Copyright (C) 1999-2005 ImageMagick Studio LLC

.

Valakinek valami egyéb ötlet? Vagy rosszul írok valamit? Direkt átneveztem a.jpg- re, és egérrel másoltam :- ).

Version: ImageMagick 6.5.5-3 2009-08-27 Q16 OpenMP http://www.imagemagick.org

Azok borzalmasan régiek :)

sudo aptitude install -t unstable imagemagick

Ha nincs benne az unstable ág, akkor tedd bele a kedvenceidet a /etc/apt/sources.list-be, illetve:

fisher@zsebi:/tmp$ cat /etc/apt/apt.conf.d/99-pref-distrib
APT::Default-Release "testing";

Bár ez lehet, hogy nem is kell, mert:

fisher@zsebi:/tmp$ cat /etc/apt/preferences
Package: *
Pin: release a=stable
Pin-Priority: 700

Package: *
Pin: release a=lenny
Pin-Priority: 700

Package: *
Pin: release a=testing
Pin-Priority: 650

Package: *
Pin: release a=unstable
Pin-Priority: 600

Package: *
Pin: release a=sid
Pin-Priority: 600

És utána szuper lesz minden.

Igen, ezt a stupid módot fentebb próbáltam, csak túl sok hívás. Nem lehetne valahogy az identify- s sort összevonni az első converttel? Ja igen, identifyvel állapítom meg a méretét.

Ezen a progin szerintetek lehetne optimalizálni valamit?:


#!/bin/bash

FI=$1;
FO=$2;
TMP="/tmp/tmpfile.`perl -e 'print rand(5)'`";

xy=`identify $FI | cut -f 3 -d\ `;
x=`echo $xy | cut -f 1 -dx`;
y=`echo $xy | cut -f 2 -dx`;
echo "$xy $x $y";

if [ $x -gt $y ]; then
 convert -crop $y'x'$y $FI $TMP;
 convert -resize 128x128 $TMP $FO;
# echo "a";
elif [ $x -lt $y ]; then
 convert -crop $x'x'$x $FI $TMP;
 convert -resize 128x128 $TMP $FO;
# echo "b";
else
 convert -resize 128x128 $FI $FO;
# echo "c";
fi;

Annyi biztos, hogy az összes fájl csak betűkből, számokból, és pontokból áll, így a méret megállapításánál elég a fenti megoldás.