Как сделать такой фокус с фотографиями?

123
C
На сайте с 20.09.2007
Offline
114
#11

Вы сами для себя должны определить максимальные размеры привьюх.

Определяют их обычно - берут большое количество реальных фоток и смотрят их размеры (уменьшив до нужного размера). Расставляют на страницу и определяют сколько будет в строке, какой ширины, какой отступ, смотрят оптимальную высоту. Все. Теперь у вас есть фиксированный размер по ширине.

После уже масшитабируете по ширине, выравниваете по горизонтали, кадрируете (указав также фиксированную высоту).

Если высота превышает ширину - можете еще больше заморочиться и анализировать по пикселям. Чтобы кадрирование произошло не будучи с выравниванием по центру, а будучи с учетом выравнивания разницы пикселей симметричные сторонам. Но это реально афигенческие заморочки.

Либо пишите себе для этого полуручной режим. Чтобы самому перемещая рамку видимости - кадрировать так как надо. Но тут все зависит от кол-ва фоток. Это для привьюх.

А для оригиналов - смотря какие фотки и для чего. Зачастую их 1в1 и не надо, а надо для просмотра в браузере.

В этом случае идете на ЛиРу и смотрите статистику по разрешениям экрана, решаете под какую подстраиваться, после уже учитываете как будете выводить оригинал (может через shadowbox) либо подстраиваться под свой дизайн. Соответственно - так вы вычисляете размеры изображения. Скриптом меняете размер оригиналам.

p.s. Если есть возможность: храните все в виде - оригинал как он есть, изображение для показа полного размера, привьюха. Т.е. второе и третье - вы делайте скриптом. А потом через какие-то промежутки времени (если у вас количество изображений меняется) оригиналы прогоняйте через макрос Фотошопа и обратно заливайте на сервер.

Ибо после фотошопа и размер меньше, и качество лучше, и больше инструментов для уникализации, и, например, в jpeg можно вшить скрытую ссылку копирайт. И т.п.

ИМХО, самые лучшие VDS: https://cp.inferno.name/aff.php?aff=4048
seosniks
На сайте с 13.08.2007
Offline
389
#12
postavkin:
Этот скрипт, который делает картинки для превью, он их делает все в один размер, даже если они первоначально разного размера? Решение на js - что значит "просто" - не совсем понял функционал, поясните плиз.

Вот три примера, указаны по порядку с верху в низ.

превью порезанное скриптом

полная картинка порезана скриптом

вот оригинал без изменений

Само собой если маленькая, он увеличит, если большая уменьшит но картинка не обрезается а уменьшается.

Решение на js - что значит "просто

Ну вот для примера http://highslide.com

Вот готовый скрипт

<?php


$w=150; // Ширина картинки превью
$h=110; // Высота картинки превью
$wf=300; // Ширина большой картинки
$hf=200; // Высота большой картинки

$img_norm ='img/norm/';//Папка превью
$img_small = 'img/small/';//Папка нормальной картикни

$imagezz="http://en.rian.ru/images/17126/07/171260792.jpg"; //Источник картинки
$image_title3 = basename($imagezz); // basename получает название картинки 171260792.jpg
$im=@imagecreatefromjpeg($imagezz);
$im1=@imagecreatetruecolor($wf,$hf);
$im2=@imagecreatetruecolor($w,$h);
@imagecopyresampled($im1,$im,0,0,0,0,$wf,$hf,@imagesx($im),@imagesy($im));
@imagecopyresampled($im2,$im,0,0,0,0,$w,$h,@imagesx($im),@imagesy($im));
@imagejpeg($im1,$img_norm . $image_title3,70);
@imagejpeg($im2,$img_small.$image_title3,70);
@imagedestroy($im);
@imagedestroy($im1);
?>

в строке @imagejpeg($im1,$img_norm . $image_title3,70);

цифра 70 это качество картинки, разница ощутима, при 100 выдает 300х200 45 кб

при 70 всего 10 кб

P
На сайте с 06.01.2009
Offline
601
#13

seosniks, теперь я совсем запутался.

Скажите, пожалуйста, по порядку.

У меня есть оригинальные картинки в папке.

1. С чего правильно начать - сделать папку превью и сложить туда картинки. В страницу галереи брать картинки именно из папки превью. Или все таки в странице галереи подгружать оригиналы, но скриптом их уменьшать?

2. Картинки правильно будет уменьшать до размера чтобы ширина и высота не выходили за заданные пределы, например 200*150? И картинки предпросмотра в итоге получаются (как и оригинал) разного размера как тут http://highslide.com и их вставлять в рамку заданного размера? Или все-таки картинки сделать четко 200*150, но я так понял ваш скрипт не обрезает их, а ужимает если есть лишняя длинна или высота. Получается внутри картинки меняются пропорции, ну т.е. если стоит стол, то на оригинале он один, на превью он не соответствует реальному соотношению ширины и высоты. Только учитывая то что картинка маленькая, это может быть не заметно.

ps Есть проблема

С помощью Вашего скрипта попробовал обработать 1100 фото. Выкидывает, т.е. делает штук 500 и всё, больше не может. Не знаете, где решение?

Да, в строке

$imagezz="http://en.rian.ru/images/17126/07/171260792.jpg"; 

прописал относительный путь на своем сервере

$imagezz="/images/$file.jpg"; 
P
На сайте с 06.01.2009
Offline
601
#14

Ребят, прошу помочь. Вообщем в итоге у меня такой скрипт.

Поскольку первоначальные фото размещены так

/image/zavod/kollection/несколько.jpg

/image/zavod/kollection2/несколько.jpg

/image/zavod2/kollection/несколько.jpg

/image/zavod2/kollection2/несколько.jpg

и т.д. до /image/zavod22/kollection7/несколько.jpg

ТО

1. входим в папку image и записываем имена папок в массив $files завершаем цикл

2. открываем цикл с массивом $files пока есть записи делаем следующее

2.1. заходим в папку /image/$files/ видим папку - kollection (записали имя папки в $kollection)

2.1.1. заходим в /image/$files/kollection видим файл *jpg (имя файла записали в $file)

и вот тут мы начинаем делать новый превьюшный файл, который сохраняем

/prevyu/$files/$kollection/$file

аналогично со след jpg файлом

закрываем папку kollection

переходим к 2.1. берем следующую папку kollection и снова 2.1.1.

папки в данном $files кончились, тогда берем следующую ячейку массива и снова повторяем все

Но почему то не выполнить ему обработку всех 1100 фото

ps2 Извините, что много понаписал. Но удалось кое что исправить. Я просто сперва в файл txt собрал все пути к нужным фото, потом чтобы не в тех же циклах было, в самом конце кода, беру этот файл, закидываю в массив и беру поочереди ячейку массива (путь к фото) и выполняю с фото то что скрипт посоветовал seosniks

Теперь все создается, записывается - но в папке превью все фотки черные квадраты.

seosniks
На сайте с 13.08.2007
Offline
389
#15

Вот вам работающий пример.

1) Соберет картинки из папки А

2) порежет создаст превью и большую картинку

3) сложит в папку Б

4) С под папками не работает надо дописывать.


<?php
$w=60; // Ширина картинки превью
$h=60; // Высота картинки превью
$wf=280; //Ширина большой картинки
$hf=180; // Высота большой картинки

$img_new =0; // создает папку для каждой картинки нарпимер 346 и в ней создает картикни тумбу 346_thumb.jpg и большую 346.jpg
//$img_new =1; // все картинки ложит в одну папку тумбу 346_thumb.jpg и большую 346.jpg
$path = "Y:/home/deti.ru/www/x2/";// Из этой папки берем картинки оригиналы
$end_img= "Y:/home/deti.ru/www/x3/"; //Сюда сохраняем
$d = dir($path);
if ($d) {
$files = $dirs = array();
while (false !== ($name = $d->read())) {
if ($name === '.' || $name === '..') continue;
$FullName = $path . "/" . $name;
if (is_dir($FullName)) $dirs[] = $name;
elseif (is_file($FullName)) $files[] = $name;
}
$d->close();

// print_r($files);
$all= count($files);
for($j=0;$j<$all; $j++) {
$jx=$j+928;
//$preg_images3= trim($files[$j]);

$image_title4= basename($files[$j]);
$image_titl=str_replace('.jpg','', $image_title4);
$papka = $image_titl;

if($img_new){
if( @!is_dir($end_img.$jx)) {mkdir($end_img.$jx); echo "Создаем папку $papka" ; } echo '<br />';
$slash ="/";
}else{
$slash ='';
}
$imagez2=$path.$files[$j];
$im=@imagecreatefromjpeg($imagez2);
$im1=@imagecreatetruecolor($wf,$hf);
$im2=@imagecreatetruecolor($w,$h);
@imagecopyresampled($im1,$im,0,0,0,0,$wf,$hf,@imagesx($im),@imagesy($im));
@imagecopyresampled($im2,$im,0,0,0,0,$w,$h,@imagesx($im),@imagesy($im));

@imagejpeg($im1,$end_img.$slash.$jx.'.jpg',100);
@imagejpeg($im2,$end_img.$slash.$jx.'_thumb.jpg',100);
@imagedestroy($im);
@imagedestroy($im1);

}

}
else{ echo 'Невозможно прочитать папку '.$path; }

echo 'Готово';
?>
seosniks, теперь я совсем запутался.
Скажите, пожалуйста, по порядку.
У меня есть оригинальные картинки в папке.

есть у меня софт мог дать, он все фотки подгонит в один стандарт и сложит куда укажите

Но она так же на может копать из под папок.

вот тут софт http://www.ln-soft.narod.ru проги халявные и очень хорошие.

P
На сайте с 06.01.2009
Offline
601
#16

Я почти допилил. Берет файлы урл картинки которую надо обработать из текстового файла.

Одна проблема, при переделывании фото, сохраняет их черными прямоугольниками.

Помогите, плиз, где ошибка в коде, я так понимаю - не правильно создаю папки подпапки.


$img_small = 'prevyu/'.$zavod.'/'.$kollekzia.'/'; //Папка маленькой картинки prevuy/apavisa/beton/
$dirz = 'prevyu/'.$zavod.''; // проверим есть ли папка prevyu/apavisa, если нет - создадим
if (!is_dir($dirz)) {
mkdir($dirz, 0700);
}
$dirzk = 'prevyu/'.$zavod.'/'.$kollekzia.''; // проверим есть ли папка prevyu/apavisa/beton, если нет - создадим
if (!is_dir($dirzk)) {
mkdir($dirzk, 0700);
}

$imagezz="../coll-photo/$zavod/$kollekzia/$file"; // берем исходную фотку
...переделываем и сохраняем
$image_title3 = basename($imagezz); // basename возвращает имя файла;
$im=@imagecreatefromjpeg($imagezz);
$im2=@imagecreatetruecolor($w,$h);
@imagecopyresampled($im2,$im,0,0,0,0,$w,$h,@imagesx($im),@imagesy($im));
@imagejpeg($im2,$img_small.$image_title3,70);
@imagedestroy($im);
@imagedestroy($im2);

ps просто даже папки странно создаются - их не удалить через ftp соеднение.

Кстати, такая фигня когда сразу много фото переделываю, если без цикла (т.е. с одной фоткой) то всё норм...

зы2 сделал. фото нормально пишутся, но всю 1000 все равно не может обработать.

Оказывается надо было после вынимания строки из текстового файла почистить строку с помощью $urlfoto = trim($urlfoto);

Теперь папки создаются нормально и удаляются, но почему то никак скрипт не доходит до конца списка...

560-580 картинок, дальше не идет

seosniks
На сайте с 13.08.2007
Offline
389
#17

Теперь папки создаются нормально и удаляются, но почему то никак скрипт не доходит до конца списка...
560-580 картинок, дальше не идет

Разделите его на 3 части и в три этаба обработайте.

Возможно времени не хватает на обработку.

Как варинт в верху файла добавьте попробуйте это

set_time_limit(0);

ignore_user_abort(true);
P
На сайте с 06.01.2009
Offline
601
#18

Да я сделал так считаю ячейки выдернутые и поставил уже

if ($e===300 or $e===600 or $e===900) { sleep(120); echo "<br>продолжим<br>";}

сейчас попробую Ваш вариант. Спасибо

---------- Добавлено 11.02.2012 в 19:04 ----------

seosniks:
Разделите его на 3 части и в три этаба обработайте.
Возможно времени не хватает на обработку.
Как варинт в верху файла добавьте попробуйте это

set_time_limit(0);
ignore_user_abort(true);

Этот код так и поставить без измнений если то не помогает.

Мой sleep тоже не помог.

Как ещё можно сделать, честно говоря, кроме варианта в три цикла по-очереди с перерывом сделать если, но ведь это тоже самое почти что и со sleep я попробовал...

ps Пришлось сделать так и запускать несколько раз скрипт

$fotki = array();

$fotki=file('spisok.txt'); //проверим старый файл на количество ранее запис моделей

$vsegofoto = count($fotki);

for ($x=0; $x<300; $x++) {

$urlfoto = $fotki[$x];...

seosniks
На сайте с 13.08.2007
Offline
389
#19
Мой sleep тоже не помог.

Зачем вам слип, он же на оборот время увеличит, если картинки ваши, а не с поисковиков где забанят, то и слип не нужен.


Этот код так и поставить без измнений если то не помогает.

Вот так

<?php

set_time_limit(0);
ignore_user_abort(true);

//т остальной код***
?>

если на хостинге нормально настроено, то поможет.

avius
На сайте с 05.05.2009
Offline
90
#20
123

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий