Бавно преоразмеряване на голямо изображение на ImageMagic

Здравейте, използвам imagemagic за преоразмеряване на изображението. Имам голямо jpg изображение 20 000px x 8000px, то е около 2,5mb, опитвам се да преоразмеря до 95% с convert и mogrify по този начин:

convert -resize 95% source.jpg destination.jpg
mogrify -resize 95% image.jpg

Имам свободни 6,5 GB RAM, след което се опитвам да преоразмеря 50%. Това преоразмеряване е много бързо за около 20 секунди, ако се опитам да преоразмеря до 95%, получавам резултат само след 9 минути. Най-интересното е, че се опитвам да преоразмеря до 52% и получавам резултат само след 4 минути много голяма е разликата 20 секунди и 4 минути, но разликата в резултата при преоразмеряване е само 2%

Това, което видях в диспечера на задачите, след което стартирах процеса на преоразмеряване на изображението 50%. imagemagic процесът много бързо нараства ram като този: 200 MB,400 MB,600 MB и т.н. това е около 200 mb/s. След това преоразмерявам 52%-99% ram расте много бавно по този начин: 45MB, 47MB, 51MB и т.н. само 2-3 mb/s. След това RAM надвишава около 1,3 ~ GB, това е край и резултатът е получен. Не знам защо растежът на овен е толкова бавен..


person user3778390    schedule 21.10.2014    source източник


Отговори (2)


Не съм толкова запознат с IM, но най-общо казано, очевидно 50% се постигат лесно: най-простият начин е да вземете само всеки нечетен (или четен) пиксел. Малко по-сложно решение е да се направи средна стойност от квадрат 2x2 пиксела (разделянето на 2 или 4 е просто, много бързо битово изместване). Може да се използват и по-модерни методи... Все пак това се постига много бързо, независимо от големия размер на вашето изображение.

Въпреки това 95% или 52% е по-сложно, защото един краен пиксел по някакъв начин съдържа информация от незакръглен (с плаваща запетая... следователно по-бавен) брой оригинални пиксели (като 1,05... или 1,92... във вашите примери), което предполага повече сложни изчисления (за да се опитаме да произведем добре изглеждащ резултат), като бикубично повторно вземане на проби (очевидно IM може да реши да използва различни методи за преоразмеряване в зависимост от изходното изображение, вижте тук), следователно това непропорционално въздействие върху времето за обработка.

Що се отнася до RAM, зависи от метода, използван за преоразмеряване. За 50% изображението се обработва много бързо, така че също се зарежда напълно в паметта бързо (20000px * 8000px * 3B/px -> 480MB + евентуално алфа канал). Други методи за повторно вземане на проби обаче ще бъдат по-бавни и може да се нуждаят от повече RAM за изчисления. Това, което наблюдавате, предполага, че очевидно изображението се зарежда прогресивно в RAM по време на обработката, а не цялото наведнъж.

Опитайте да си поиграете с опцията -scale и разгледайте опциите за филтриране за преоразмеряване.

person FredP    schedule 21.10.2014
comment
Съгласен съм с вас, но имам малко интересни факти, ако преоразмеря 50% или по-малко като 49,48,47,46,45 и т.н., получавам резултат много бързо. Но над 50% лимит е 51%. С 51% получавате резултат бързо, с 52% получавате резултат бавно.. - person user3778390; 21.10.2014
comment
това вероятно е, защото първо се мащабира до 50% и след това отново се мащабира до крайния размер. тъй като 50% се постигат бързо и лесно, тъй като FredP каза, че окончателното преоразмеряване трябва да обработва 4 пъти по-малко данни - person rostok; 21.10.2014
comment
@Rostok Напълно възможно, тъй като изглежда като разумна оптимизация. Но защо и с 51%? Ако намеря достатъчно време, може да изтегля източника и да го разгледам. - person FredP; 22.10.2014
comment
@user3778390 какво ще кажете за вашите ресурси. бихте ли предоставили identify -list resource и версия за незабавни съобщения. Q8 ли е или Q16? - person rostok; 22.10.2014

Можете да опитате да мащабирате изображението, докато се чете, а не след това по този начин:

time convert input.jpg[95%] output.jpg

а не така:

time convert input.jpg -resize 95% output.jpg

Първият е с около 15% по-бърз на моя iMac.

person Mark Setchell    schedule 25.11.2014