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

Реферальная программа Мегаплана


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

#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. Помогите отделить из функции кусок в View
  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