Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как запретить GD2 увеличивать фотографии?
 
 автор: Фронт   (13.01.2008 в 16:44)   письмо автору
 
 

И можно ли это реализовать?
Имеется например фотоальбом, по умолчанию размер 640х480, когда юзер грузит огромное фото - нет проблем, оно отлично урезается до 640х480, а вот когда фото значительно мЕньшее - GD2 растягивает его до 640х480, результат - безобразное качество. Как запретить увеличивать меньшие изображения? Буду премного благодарен.

В скрипте прописано следующее:

function uploadImage($aFileArray,$aSaveAs,$aMax,$aDimensionArray,$aVideo,$aProgram,$aNoDate=null)
{
global $set_chmod,$set_image_filetypes,$set_video_filetypes,$set_doc_filetypes;

if ($set_video_filetypes)
$lVideoArray=split(",",$set_video_filetypes);
if ($set_doc_filetypes)
$lDocArray=split(",",$set_doc_filetypes);
if ($set_image_filetypes)
$lImageArray=split(",",$set_image_filetypes);


/*
Example:
$FileArray=$_FILES["userfile"];
$SaveAs="/home/delta/public_html/imageupload/upload/test";
$MaxSize="10000";
$DimensionArray[]="200x190";
$DimensionArray[]="500x500";

$returnValue=uploadImage($FileArray,$SaveAs,$MaxSize,$DimensionArray,"",0);

if (is_int($returnValue))
echo getErrorMsg($returnValue);
else
{
foreach ($returnValue as $item)
{
echo "Filen $item ble lastet opp!";
echo "<img src='upload/$item'><br>";
}
}

*/

// File type check
if ($aVideo=="1" && !in_array($aFileArray["type"],$lVideoArray))
{
echo $aFileArray["type"];
return 1;
}
else if ($aVideo=="2" && !in_array($aFileArray["type"],$lDocArray))
{
echo $aFileArray["type"];
return 1;
}
else if (!$aVideo && !in_array($aFileArray["type"],$lImageArray))
{
echo $aFileArray["type"];
return 1;
}

// Security check
if (!is_uploaded_file($aFileArray["tmp_name"]))
return 2;

// File-size check
if ($aFileArray["size"]>($aMax*1024))
return 3;

// New filename
if (!$aVideo)
{
$fileNameSplit=split("/",$aSaveAs);
$lastFileName=end($fileNameSplit);
$lToday=date("YmHs");
if ($aNoDate==1)
$fileName=$lastFileName;
else
$fileName=$lastFileName . "_" . $lToday;
$dotpos = strrpos($fileName, '.');
$fileName = str_replace('.', '_', substr($fileName, 0, $dotpos)) . substr($fileName, $dotpos);


if ($aFileArray["type"]=="image/gif")
$ext="gif";
elseif ($aFileArray["type"]=="image/pjpeg" || $aFileArray["type"]=="image/jpeg")
$ext="jpg";
elseif ($aFileArray["type"]=="image/png")
$ext="png";
elseif (!$aVideo)
return 4;

$newFileName=$fileName . "." . $ext;
if ($aNoDate==1)
$saveTo_org=$aSaveAs . "." . $ext;
else
$saveTo_org=$aSaveAs . "_" . $lToday . "." . $ext;

}
else
{
$fileNameSplit=split("/",$aSaveAs);
$lastFileName=end($fileNameSplit); // 1 or 2 or 3.. whatever the ad number is
$newFileName=strtolower($aFileArray["name"]);
$dotpos = strrpos($newFileName, '.');
$newFileName = str_replace('.', '_', substr($newFileName, 0, $dotpos)) . substr($newFileName, $dotpos);
$saveTo_org=$aSaveAs . "_" .$newFileName;
$newFileName = $lastFileName."_".$newFileName;
}


if (!@move_uploaded_file($aFileArray['tmp_name'],$saveTo_org))
return 5;

// Do thumb/resize-creation
$returnFileArray[]=$newFileName;
if (!empty($aDimensionArray) && $aProgram!=0)
{
$total_dimentions=count($aDimensionArray);

foreach ($aDimensionArray as $item)
{

$c++;
$xyArray=split("x",$item);
$x=$xyArray[0];
$y=$xyArray[1];

$saveTo=$aSaveAs . "_" . $lToday . "_tmb" . $c . "." . $ext;
if ($total_dimentions==$c)
$saveTo=$saveTo_org;
else
$returnFileArray[]=$fileName . "_tmb" . $c . "." . $ext;

if ($aProgram==1)
makeIMThumb($saveTo_org,$saveTo,$item);
elseif ($aProgram==2)
$res=makeGDThumb($saveTo_org,$saveTo,$ext,$x,$y);

@chmod("$saveTo", octdec($set_chmod));

if (!file_exists($saveTo))
return 6;


}

}

return $returnFileArray;

}

function makeIMThumb($aFromfile,$aToFile,$aGeo)
{
global $set_magic_path;
$command = "$set_magic_path -quality 80 -geometry $aGeo $aFromfile $aToFile";
$res = exec($command);
}

function makeGDThumb($aInputPath,$aOutputPath,$aFileType,$max_x,$max_y)
{

if ($aFileType=="jpg")
$source = ImageCreateFromJPEG ($aInputPath);
elseif ($aFileType=="png")
$source = ImageCreateFromPNG ($aInputPath);
elseif ($aFileType=="gif")
$source = ImageCreateFromGIF ($aInputPath);

list($x, $y) = getimagesize($aInputPath);

if (($max_x/$max_y) < ($x/$y)) {
$save = imagecreatetruecolor($x/($x/$max_x), $y/($x/$max_x));
}
else {
$save = imagecreatetruecolor($x/($y/$max_y), $y/($y/$max_y));
}

imagecopyresampled ($save, $source, 0, 0, 0, 0, imagesx($save), imagesy($save), $x, $y);

if ($aFileType=="jpg")
imagejpeg($save,$aOutputPath,90);
elseif ($aFileType=="png")
imagePNG($save,$aOutputPath);
elseif ($aFileType=="gif")
imageGIF($save,$aOutputPath);

}

   
 
 автор: LordFreeman   (14.01.2008 в 12:30)   письмо автору
 
   для: Фронт   (13.01.2008 в 16:44)
 

Вы же на входе знаете размер исходной фотографии.
Проверяете если размер фотки меньше чем максимально разрешенная - то оставляете тот размер который был на входе.

   
 
 автор: Фронт   (15.01.2008 в 22:18)   письмо автору
 
   для: LordFreeman   (14.01.2008 в 12:30)
 

Спасибо за ответ!
Нет, я не знаю размеров - они бывают какие угодно, от микрологотипов (судя по результату "в клеточку") :((( до больших и четких.
У меня в админке выставлено "подгонять все под 640х480", пользователи заливают фотки, которые всегда независимо от размера преобразуются в 640х480, а я хочу запретить скрипту _увеличивать_ до этого размера, а разрешить только уменьшать. Как это сделать? Если вкурсе, ткните меня хотя бы в ту строчку которая это делает, и как с ней можно поиграть, чтобы этого добиться. Читал про GD2.dll но нужного не нашел, видел только про "преобразование", а не конкретно про увеличение или уменьшение.

PS. Не силен в PHP а тем более в этом GD, если можно - на пальцах.


Чувствую что где-то в этих строках наверное кроется суть:

list($x, $y) = getimagesize($aInputPath);

if (($max_x/$max_y) < ($x/$y)) {
$save = imagecreatetruecolor($x/($x/$max_x), $y/($x/$max_x));
}
else {
$save = imagecreatetruecolor($x/($y/$max_y), $y/($y/$max_y));
}

imagecopyresampled ($save, $source, 0, 0, 0, 0, imagesx($save), imagesy($save), $x, $y);

   
 
 автор: LordFreeman   (16.01.2008 в 07:10)   письмо автору
 
   для: Фронт   (15.01.2008 в 22:18)
 

я как раз имел ввиду что через getimagesize можно получить размер исходной фотки. Сейчас не помню - домой приду, посмотрю пример какой нить (вроде что-то было)

   
 
 автор: KPETuH   (16.01.2008 в 08:30)   письмо автору
 
   для: Фронт   (15.01.2008 в 22:18)
 

<?
list($x$y) = getimagesize($aInputPath);

Это как раз и ваши размеры $x ширина $y высота сравнивайте их с требуемыми размерами и если меньше то не выполнять подгонку :)

   
 
 автор: Фронт   (16.01.2008 в 11:57)   письмо автору
 
   для: KPETuH   (16.01.2008 в 08:30)
 

Братцы, черкните строчки которые надо вставить, если не трудно, а то не знаю с какой стороны тут подойти...

$max_x и $max_y это те самые размеры 640х480 прописанные в конфиге админки?

Как я понял - надо прописать что-то вроде:

if ($max_x+$max_y) > ($x+$y)
{то нифига ненадо делать, а просто сохранить под новым именем...}

А если заливаемая фотка будет 480х640 тогда как?
elseif ($max_x+$max_y) = ($x+$y)

:))) Выручайте, плиз, на этом мои идеи кончились...

   
 
 автор: LordFreeman   (16.01.2008 в 12:05)   письмо автору
 
   для: Фронт   (16.01.2008 в 11:57)
 


If ($max_x > $x) AND ($max_y>$y)  {
...
}


вроде так

   
 
 автор: Фронт   (05.02.2008 в 15:49)   письмо автору
 
   для: LordFreeman   (16.01.2008 в 12:05)
 

Спасибо!
Вот так сделал - все отлично, проверил - пашет.


list($x, $y) = getimagesize($aInputPath);

If ($max_x > $x and $max_y > $y) {
 $save = imagecreatetruecolor($x, $y);
}
elseif (($max_x/$max_y) < ($x/$y)) {
 $save = imagecreatetruecolor($x/($x/$max_x), $y/($x/$max_x));
}
else {
 $save = imagecreatetruecolor($x/($y/$max_y), $y/($y/$max_y));
}

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования