Долго обрабатывает изображение через GD ?

bora

Guest
Долго обрабатывает изображение через GD ?

Значит что я делаю просто вырезаю кусок изображения из достаточно большого файла… проблема в следующем когда даешь запрос на скрипт он думает секунды 3 при этом памяти жрет 170м в процессе… где я собственно неправ или так и должно быть ? (или может imagemagic лучше справится) ?

Вот кусок скрипта.

Код:
$im = imagecreatefromjpeg("./images/8192.jpg");
$iz = imagecreatetruecolor($soc,$soc);

imagecopy($iz, $im, 0, 0, $pt["x"]-$crp, $pt["y"]-$crp, $soc,$soc);

header("Content-Type: image/jpeg");
imagejpeg($iz, "" , 85);
imagedestroy($im);
imagedestroy($iz);
Картинка значит 8192х4096 в оптимизированном виде весит 2мега.
 

tony2001

TeaM PHPClub
>Картинка значит 8192х4096 в оптимизированном виде весит 2мега.
GD перед всеми операциями переводит изображения в свой внутренний формат (по объемам сравним с BMP), потом проводит все действия, после чего результат конвертирует в соотв-щий формат.
Представь себе сколько будет занимать BMP размером 8192х4096 и сколько займет конвертация вырезанного фрагмента в JPEG.
 

vovchik542

Новичок
Так, пример. Файл размером ~2Мб, resize до 100x100, 7 секунд(Атлон 1200). > 2Мб даже не читает, видимо ограничение стоит. По-моему твоя обработка быстрее должна быть. Не знаю почему виснет.
 

bora

Guest
У меня p4 2.0a / 512mb …. И я вырезаю изображение 350х350 Если система ничем не занята то секунды 3… а если активно работает фаервол,мускл,сервер то секунд 10-15…

Блин а я еще хотел добавить картинку 21000pix

Наверно как вариант нужно разбить изображение на квадраты и потом делать склейку и вырезание…
 

tony2001

TeaM PHPClub
bora
почему бы сразу не перейти к изображениям миллион на миллион, террабайтных размеров?
я не совсем понимаю смысл подобных действий.
 

Фанат

oncle terrible
Команда форума
Смысл-то понятен.
А вот кое-кто не понимает, что такое работа с изображениями. И полагает, что для этого требуется пара инструкций процессора и несколько килобайт памяти.
И верит, что если одна программа делаест три секунды, то другая сделает за три сотых.
 

untied

Сдвинутый новичок
Ну если так уж хочется обрабатывать большие картинки именно на сервере, то почему бы не написать скрипт на C? (разумеется, при этом потребуется его еще и откомпилировать на сервере)
Насколько я знаю, бесплатные библиотеки C для работы с CGI и картинками всегда можно найти.
Работать будет однозначно быстрее! :D
 

camka

не самка
Поищи информацию на тему "lossless jpeg transformation" там такие вещи делаются в обход процессов пережатия, посему очень быстро.
 

bora

Guest
Спасибо попробую поискать…


Суть в следующем это я делаю адон (Zoom) для определения по IP на карте мира… вот есть мысль разбить изображение и по виртуальным координатам определять какой будет кусок изображения… я думаю так быстрее будет.


Картинка 8192х4096 разбита на 128 сегментов…(Сегменты сохранены как картинки 1.jpg … 128.jpg) с расширением 512х512 в сегменте.. вот схемка..

Код:
    1  2  3  4  5  6  7  8  9  10 11 12 13 14 15 16
    |  |  |  |  |  |  |  |  |  |  |  |  |  |  |  |
1 - 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16
2 - 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32
3 - 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
4 - 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
5 - 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80
6 - 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96
7 - 97 98 99 00 01 02 03 04 05 06 07 08 09 10 11 12
8 - 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
Непонятно как сделать чтобы скрипт определил по координатам какой это сегмент… например x=823 y=2034 какой будет сегмент ?
 

SiMM

Новичок
Твой вопрос на уровне начальных классов средней школы. Тебе понадобяться операция / (+округление в меньшую сторону - [m]floor[/m]) и %
 

bora

Guest
Я сам и так могу посчитать…;-)

Я про то как это будет на PHP ? можешь пример привести ?
 

SiMM

Новичок
Так посчитай. На PHP оно так и будет. Какой момент вызывает проблемы? Если приведёшь выкладки - готов ткнуть носом в ман.
 

bora

Guest
Короче я понял всем спасибо...


Код:
$chislo = 0;
$width = 8192;
$height = 4096;
$segments = 128;
$ssize = 512;
$hline = 16;
$vline = 8;
$x = 512;
$y = 512;

$chisloX = ceil($hline-(($width-$x)/$ssize));
$chisloY = ceil($vline-(($height-$y)/$ssize));
$chislo = ($hline*($chisloY-1)) + $chisloX;
 
Сверху