Перейти к содержимому



Помогите доработать функцию

#1 surfer

surfer
  • Заблокированные
  • 1 956 сообщений
  • Репутация: 71
0

Отправлено 12 Февраль 2010 - 13:46

вот известная функция, которая создает уменьшенную копию изобажения
<?php

// Функция создающая уменьшенную копию фотографии $filename,
// которая помещается в файл $smallimage
// Уменьшенный вариант имеет ширину и высту равную
// $w и $h пикселам, соответственн.

function resizeimg($filename, $smallimage, $w, $h)

{

// Имя файла с масштабируемым изображением
$filename = $filename;

// Имя файла с уменьшенной копией.
$smallimage = $smallimage;

// определим коэффициент сжатия изображения, которое будем генерить
$ratio = $w/$h;

// получим размеры исходного изображения
$size_img = getimagesize($filename);

// получим коэффициент сжатия исходного изображения
$src_ratio=$size_img[0]/$size_img[1];



// Здесь вычисляем размеры уменьшенной копии, чтобы при масштабировании сохранились
// пропорции исходного изображения
if ($ratio<$src_ratio)
{
$h = $w/$src_ratio;
}
else
{
$w = $h*$src_ratio;
}

// создадим пустое изображение по заданным размерам
$dest_img = imagecreatetruecolor($w, $h);

// создаем jpeg из файла
$src_img = imagecreatefromjpeg($filename);



// масштабируем изображение функцией imagecopyresampled()
// $dest_img - уменьшенная копия
// $src_img - исходной изображение
// $w - ширина уменьшенной копии
// $h - высота уменьшенной копии
// $size_img[0] - ширина исходного изображения
// $size_img[1] - высота исходного изображения
imagecopyresampled($dest_img, $src_img, 0, 0, 0, 0, $w, $h, $size_img[0], $size_img[1]);

// сохраняем уменьшенную копию в файл
imagejpeg($dest_img, $smallimage);

// чистим память от созданных изображений
imagedestroy($dest_img);
imagedestroy($src_img);

return true;

}

?>


не всегда известна ширина и высота загружаемого изображения,
поэтому я ее вызываю

resizeimg($image, $smallimage, 150, 150)

но тогда она делает 150 пикселей самую широкую сторону, а как сделать, чтоб она делала 150 пикселей самую узкую сторону?

разобрасля заменил $ratio<$src_ratio на $ratio>$src_ratio

 

 

  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85
Советую обратить внимание на следующее:
  1. Помогите доработать функцию, которая обрезает изображение
  2. Помогите доработать слайдер!
  3. Сервисы, облегчающие работу оптимизатора.
  4. Помогите, пожалуйста, новичку советами
  5. Есть ли толк от проделанной мной роботе по оптимизации сайта в Яндексе

#2 ZiTosS

ZiTosS
  • Неактивные
  • 5 148 сообщений
  • Репутация: 8

Отправлено 12 Февраль 2010 - 23:18

sc2r2bey, функция конечно полезная, но поддерживает тока JPG.
Да и функция немного не правильно написана. Обычно задают мин размер одной из сторон. Тогда скрипт сам определит, какая сторона и меньше, ту и подгонит под этот размер, а большую сторону пропорционально уменьшит.
А если ещё задать какую именно сторону сжимать, по ширине или по высоте, то будет ещё удобнее создавать картинки предпросмотра в галереях. В этом случае они все будут вровень либо по высоте, либо по ширине.

разобрасля заменил $ratio<$src_ratio на $ratio>$src_ratio

Тему можно закрывать? Или всё же функция нуждается в доработке?
  • 0

#3 surfer

surfer
    Topic Starter
  • Заблокированные
  • 1 956 сообщений
  • Репутация: 71

Отправлено 12 Февраль 2010 - 23:27

можно здесь поподробнее(очень ценные замечания!)?


  • 0

#4 ZiTosS

ZiTosS
  • Неактивные
  • 5 148 сообщений
  • Репутация: 8

Отправлено 12 Февраль 2010 - 23:43

sc2r2bey, вот тебе код класса, который создаёт thumb_image, Посмотри как тут всё реализовано:
<?php
//requires GD 2.0.1 or higher
class ThumbnailImage{
//private data mambers
var $image;
var $maxdimension;
//not applicable to gif or png
var $quality=100;
var $fileextension;
var $mimetype;
var $imageproperties;
var $types= array("jpg", "jpeg", "gif", "png");
////////////////////////////////////////////////////////
//constructor
////////////////////////////////////////////////////////
function ThumbnailImage($path, $maxdimension=100){
$this->maxdimension=$maxdimension;
//check path
is_file($path) or die ("File: $path doesn't exist.");
//check type
$extension=substr($path,(strpos($path, ".")+1));
$extension= strtolower($extension);
in_array($extension, $this->types) or die ("Incorrect file type.");
$this->fileextension=$extension;
$this->setMimeType($extension);
//get dimensions by creating imageproperties
$this->imageproperties = GetImageSize($path);
//create image
if($extension=="jpeg" || $extension=="jpg"){
$this->image=imagecreatefromJPEG($path);
}elseif($extension=="gif"){
$this->image=imagecreatefromGIF($path);
}elseif($extension=="png"){
$this->image=imagecreatefromPNG($path);
}else{
die("Couldn't create image.");
}
$this->createThumb();
}
////////////////////////////////////////////////////////
//public methods
////////////////////////////////////////////////////////
function getImage(){
header("Content-type: $this->mimetype");
if($this->fileextension=="jpeg" || $this->fileextension=="jpg"){
imagejpeg($this->image,"",$this->quality);
}elseif($this->fileextension=="gif"){
imagegif($this->image);
}elseif($this->fileextension=="png"){
imagepng($this->image);
}else{
die("Couldn't create image.");
}
}
////////////////////////////////////////////////////////
function getMimeType(){
return $this->mimetype;
}
////////////////////////////////////////////////////////
function getQuality(){
$quality;
if($this->fileextension=="jpeg" || $this->fileextension=="jpg"){
$quality=$this->quality;
}else{
$quality=-1;
}
return quality;
}
////////////////////////////////////////////////////////
function setQuality($quality){
if($quality > 100 || $quality < 1)
$quality=75;
if($this->mimetype=="image/jpeg"){
$this->quality=$quality;
}
}
////////////////////////////////////////////////////////
function destroy(){
imagedestroy($this->image);
}
////////////////////////////////////////////////////////
//private methods
////////////////////////////////////////////////////////
function setMimeType($extension){
if($extension=="jpeg" || $extension=="jpg"){
$this->mimetype="image/jpeg";
}elseif($extension=="png"){
$this->mimetype="image/png";
}elseif($extension=="gif"){
$this->mimetype="image/gif";
}else{
die ("Not a recognized type.");
}
}
////////////////////////////////////////////////////////
function createThumb(){
$srcW=$this->imageproperties[0];
$srcH=$this->imageproperties[1];
//only adjust if larger than max
if($srcW>$this->maxdimension || $srcH>$this->maxdimension){
$reduction=$this->calculateReduction($srcW,$srcH);
//get proportions
$desW=round($srcW/$reduction);
$desH=round($srcH/$reduction);
//check for gif
//create copy from original
if($this->mimetype=="image/gif"){
$copy=imagecreate($desW, $desH);
}else{
$copy=imagecreatetruecolor($desW, $desH);
}
imagecopyresampled($copy,$this->image,0,0,0,0,$desW, $desH, $srcW, $srcH)
or die ("Image copy failed.");
//destroy original
imagedestroy($this->image);
$this->image=$copy;
}
}
////////////////////////////////////////////////////////
function calculateReduction($srcW, $srcH){
//adjust
if($srcW<$srcH){
$reduction=$srcH/$this->maxdimension;
}else{
$reduction=$srcW/$this->maxdimension;
}
return $reduction;
}
}//end class
////////////////////////////////////////////////////////
?>

  • 0

#5 surfer

surfer
    Topic Starter
  • Заблокированные
  • 1 956 сообщений
  • Репутация: 71

Отправлено 12 Февраль 2010 - 23:48

блин опять класс ;)
  • 0

#6 ZiTosS

ZiTosS
  • Неактивные
  • 5 148 сообщений
  • Репутация: 8

Отправлено 13 Февраль 2010 - 00:07

sc2r2bey, его использование
файл image.php
$Thumb = new ThumbnailImage('[путь до уменьшаемого изображения]', [min размер стороны]); // создаём объект картинки предпросмотра
$Thumb->getImage(); // выводим картинку предпросмотра

файл HTML
...
<img src=".../image.php" />
...

Ну это всё к примеру, путь до файла можно передавать в GET параметре в зашифрованном виде. А можно и в нешифрованном.
Думаю, заметно как удобно использовать данный класс, так же можно назначать качество JPG, интерфейс на нормальном уровне.
  • 0

#7 surfer

surfer
    Topic Starter
  • Заблокированные
  • 1 956 сообщений
  • Репутация: 71

Отправлено 13 Февраль 2010 - 00:09

у меня есть эта книга и скрипты к ней, пока не хочу лезть в классы, пока с линейным не разберусь на уверенно ;)
  • 0

#8 gaaarfild

gaaarfild
  • Неактивные
  • 596 сообщений
  • Репутация: 0

Отправлено 12 Март 2010 - 15:57

Лезь и не переживай. =) линейное уже освоено. Я поначалу физически не понимал их. оказалось, что проще. =)
  • 0

robot

robot
  • Пользователь PRO
  • 2 652 сообщений
  • Репутация: 85

Оформление форума – IPBSkins.ru