Jump to content
  • 0

Скрипты от резидентов htmlbook.ru


Dimitry Wolotko
 Share

Question

В этом разделе будут размещены ссылки на топики, в которых просто и доходчиво разж?вывается, как сделать то или иное действо.

Скрипты сырые, объясняют только суть и алгоритм. В топике может быть несколько типовых скриптов, а также описания, правки и прочее в комментах. Рекомендую не тупо копировать, а копировать с умом, читая, думая, анализируя и не забывайте учиться.

Эти топики не расчитаны на скрипт-помойку, а больше на создание некого количества болванок, для более удачной реализации ваших идей.

В общем - учимся, товарищи.

* PHP мини-скрипты by D.S.Denton

Link to comment
Share on other sites

6 answers to this question

Recommended Posts

  • 0

Скрипт уменьшения jpg-файлов в текущей папке и наложения в правый нижний угол логотипа из png-файла.

Добавил многопоточность. Многопоточность работает только на линуксе, есличо.

Дефолтное количество потоков - 4, если в командной строке передано число, то оно интерпретируется как заданное число потоков. Число картинок делит поровно между потоками, последнему достаются остатки.

<?
/*===========================*\
| Масштабирование картинок |
| и наложение логотипа |
| * * * * * * * * * * * * * * |
|Разработал Spirit: 25.07.2008|
|Многопоточность: 17.03.2013 |
|Коррекция: 12.04.2013 |
\*===========================*/

$maxdimension = 1600;
$threads = 4; //Число потоков для обработки по умолчанию. Параметр передаётся в командной строке
$logo = imagecreatefrompng("logo.png");
$nx = imagesx($logo);
$ny = imagesy($logo);
$processes = array();
$files = array();

if ($argc > 1 && (int)$argv[1] && (int)$argv[1] > 0) $threads = (int)$argv[1];
echo "resize & logo\n--> $maxdimension\n[$threads threads]\n";

foreach (glob('*') as $fname)
if (preg_match("/\.jpg$/i", $fname))
$files[] = $fname;
$size = sizeof($files); //Количество файлов/размер массива

for ($h = 1; $h <= $threads; $h++)
if (!($pid = pcntl_fork()))
{
$gmax = $h*round($size/$threads); //Номер элемента массива, до которого будет работать этот дочерний поток
$hstart = $gmax-round($size/$threads); //Номер начального элемента массива
if ($h == $threads) $gmax = $size; //Если номер потока — последний, то он забирает все оставшиеся ему фотографии
$gc = 0; //Считалка порядкового номера фотографии для данного потока
for ($g = $hstart; $g < $gmax; $g++)
{
if (!isset($files[$g])) continue;
$fname = $files[$g];
$srcimg = imagecreatefromjpeg("./".$fname);
$x = $xorig = imagesx($srcimg);
$y = $yorig = imagesy($srcimg);
if ($x > $y) //Определяем, по какой стороне будет большее значение. $x писать короче, чем $xorig
{
$y = $maxdimension/$x*$y;
$x = $maxdimension;
}
else
{
$x = $maxdimension/$y*$x;
$y = $maxdimension;
}
$destimg = imagecreatetruecolor($x, $y);
if ($xorig > $x) //Уменьшаем
imagecopyresampled($destimg, $srcimg, 0, 0, 0, 0, $x, $y, $xorig, $yorig);
else
imagecopy($destimg, $srcimg, 0, 0, 0, 0, $x, $y); //Оставляем как есть
imagecopy($destimg, $logo, $x-$nx, $y-$ny, 0, 0, $nx, $ny);
imagejpeg($destimg, "./".$fname, 95);
imagedestroy($srcimg);
imagedestroy($destimg);
echo "$h :: [".++$gc.'/'.($gmax-$hstart)."] - {$fname}\n";
}
die;
}
else $processes[] += $pid; //Родительский поток просто записывает идентификаторы всех дочерних, чтобы следить когда они все отработают
imagedestroy($logo);

foreach ($processes as $procid) //Ждём пока все не закончат работу
pcntl_waitpid($procid, $stat);
echo 'Готово';

?>

Работает вот так: http://cs418830.vk.me/v418830075/5ca6/yWKmgUwuSt0.jpg

Link to comment
Share on other sites

  • 0

Добавил многопоточность. Многопоточность работает только на линуксе, есличо.

Это не многопоточность, это многопроцессовость.

И еще в первом цикле for убери фигурные скобки. Это, право, лишне... )) С ними под питон не так косит.

Link to comment
Share on other sites

  • 0

Ну процесс выходит с отдельным потоком, не? Главное, что работает шустрее, чем раньше.

Скобки там не обязательны, да, Просмотрел что-то.

Убрал.

Я не стараюсь косить под питон, потому что никогда в глаза его не видел.

Link to comment
Share on other sites

  • 0

Я его не осилил :) А тут никакого насилия над мозгом нет. Разве что для тех, кто математику в школе не учил, а всё списывал. А если брать нынешнее поколение, то для тех, кто домашние задания рещает через ответы.мейлру. Я не понимаю на что рассчитывают эти люди, если математика даже кондукторам нужна. Да даже газелисту нужно уметь посчитать сдачу с 40 рублей, если проезд 14 рублей, заплатили 4 человека, и каждому нужно дать сдачу так, чтобы не оказалось 5 рублей одной монетой на двоих, а ещё надо машину вести.

Не инструмент выбирает человека, а человек — инструмент. Я вот выбрал gd, он простой как валенок, а простейшее масштабирование можно писать хоть спьяну.

Link to comment
Share on other sites

  • 0

Нашёл ошибку в работе алгоритма когда соотношение числа картинок к $threads в районе 0.5 (или больше 0.5, не скажу точно). Например, при двух файлах и 4-х процесах двум процессам ничего не достаётся, но они пытаются достать из массива файлы. Можно попробовать выйти из ситуации, добавив во второй for первой стркой

if (!isset($files[$g])) continue;

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue. See more about our Guidelines and Privacy Policy