[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Уменьшение качества изображения при загрузке на се
BesTime
Гуру, знатоки php=) Никак не могу найти решения как уменьшить вес изображения при загрузке на сервер. А то не в кайф каждую картинку в фотожопе уменьшать



Спустя 1 час, 51 минута, 56 секунд (15.02.2012 - 00:56) wplounge написал(а):
GD в помощь. Подробнее здесь и здесь.

Спустя 7 часов, 12 минут, 51 секунда (15.02.2012 - 08:09) twin написал(а):
Если это разовая акция, то есть программки, которые махом уменьшают все картинки в папке. GD сильно качество может порепать. Ну а если в процессе... то imagemagic лучше, если есть возможность.

Спустя 3 часа, 52 минуты, 15 секунд (15.02.2012 - 12:01) wplounge написал(а):
Цитата
GD сильно качество может порепать.

Ну так тема и называется "Уменьшение качества изображения..." wink.gif

Спустя 45 минут, 50 секунд (15.02.2012 - 12:47) inpost написал(а):
В фотошопе нет потери качества при правильном сохранении картинки. Уменьшить можно вес в 5-10 раз.
В PHP так же можно уменьшить их вес, но потеря качества будет просто огромная(!!!).

Спустя 1 минута, 43 секунды (15.02.2012 - 12:49) walerus написал(а):
А чего тумбы не сделать и не парить моск? секундное дело cool.gif

Спустя 5 часов, 11 минут, 36 секунд (15.02.2012 - 18:00) Skesh написал(а):
я етим пользуюсь:

function img_resize($src, $dest, $width, $height, $rgb=0xFFFFFF, $quality=100)
{
if (!file_exists($src)) return false;

$size = getimagesize($src);

if ($size === false) return false;

// Определяем исходный формат по MIME-информации, предоставленной
// функцией getimagesize, и выбираем соответствующую формату
// imagecreatefrom-функцию.

$format = strtolower(substr($size['mime'], strpos($size['mime'], '/')+1));
$icfunc = "imagecreatefrom" . $format;
if (!function_exists($icfunc)) return false;

$x_ratio = $width / $size[0];
$y_ratio = $height / $size[1];

$ratio = min($x_ratio, $y_ratio);
$use_x_ratio = ($x_ratio == $ratio);

$new_width = $use_x_ratio ? $width : floor($size[0] * $ratio);
$new_height = !$use_x_ratio ? $height : floor($size[1] * $ratio);
$new_left = $use_x_ratio ? 0 : floor(($width - $new_width) / 2);
$new_top = !$use_x_ratio ? 0 : floor(($height - $new_height) / 2);

$isrc = $icfunc($src);
$idest = imagecreatetruecolor($width, $height);

imagefill($idest, 0, 0, $rgb);
imagecopyresampled($idest, $isrc, $new_left, $new_top, 0, 0,
$new_width, $new_height, $size[0], $size[1]);

imagejpeg($idest, $dest, $quality);

imagedestroy($isrc);
imagedestroy($idest);

return true;

}

img_resize("$frontfoto", "$foto", 130, 100)
// $frontfoto - переменная в которой находится фото
// $foto - название и адрес новой фотки которая сохранится на сервере с $frontfoto
// 130, 100 - резмеры



Спустя 10 минут, 38 секунд (15.02.2012 - 18:11) inpost написал(а):
Skesh
А если png ?! smile.gif

Спустя 17 минут, 18 секунд (15.02.2012 - 18:28) BesTime написал(а):
wplounge пробывал первый линк ставить не заработало, поэтому и обратился сюда

Спустя 19 минут, 9 секунд (15.02.2012 - 18:47) walerus написал(а):
Класс Thumbnail, обрабатывает gif, jpeg, pjpeg, png

Код :
&w=100 - вписывание в ширину --- image_100x75.jpg
&h=100 - вписывание в высоту --- image_133x100.jpg
&w=100&h=120 вписывание в рамку --- image_100x75.jpg
&w=100&h=125 вписывание в рамку --- image_100x75.jpg
&w=100&h=120&c - обрезка по рамке --- image_100x120.jpg
&t - уменьшение по умолчанию --- image_150x112.jpg
&tc - обрезка по умолчанию --- image_150x150.jpg

Здесь размеры после image_ - это реальный рамер картинки после уменьшения.

Как работает thumb.php
1. Смотрит, есть ли указанный оригинальный файл. Если нет, то ничего не делает.
2. Вычисляет размеры превью по параметрам и определяет имя файла превью
3. Смотрит, есть ли такой файл превью, если есть и дата его создания позже даты создания оригинала, то выдает превью, иначе создает превью заново.
4. Выдает превью и сохраняет, если надо.

Вызов thumb.php?name=$file_name + параметры необходимые....


Свернутый текст
<?php
class
Thumbnail
{
private $w;
private $h;
private $filename;
private $crop;

private $_mime_settings;
private $_fsave_allowed;
private $_tname_tpl = '%s_%sx%s';
private $_default_width = 250;
private $_default_height = 250;
private $_jpeg_quality = 90;
private $_sess_varname = 'THUMB';


public function __construct()
{
session_start();
// $_SESSION = array('THUMB' => true); // Раскоментировать, чтоб сохранялось на веник

$this->w = abs((int)@$_GET['w']);
$this->h = abs((int)@$_GET['h']);
if (!$this->w && !$this->h) {
// вписать в рамку по умолчанию
$this->w = $this->_default_width;
$this->h = $this->_default_height;
}
$this->filename = @$_GET['name'];
$this->crop = isset($_GET['c']) || isset($_GET['tc']);

$this->_mime_settings = array(
'image/gif' => array(
'ext' => '.gif',
'create' => 'imagecreatefromgif',
'save' => array(&$this, '_gif_save'),
),

'image/jpeg' => array(
'ext' => '.jpg',
'create' => 'imagecreatefromjpeg',
'save' => array(&$this, '_jpeg_save'),
),

'image/pjpeg' => array(
'ext' => '.jpg',
'create' => 'imagecreatefromjpeg',
'save' => array(&$this, '_jpeg_save'),
),

'image/png' => array(
'ext' => '.png',
'create' => 'imagecreatefrompng',
'save' => array(&$this, '_png_save'),
),
);


$this->_fsave_allowed = isset($_SESSION[$this->_sess_varname]);

$this->_run();
}
private function _run()
{
if (!file_exists($this->filename) || !is_file($this->filename)) exit;
$info = getimagesize($this->filename);
if (!$info || !isset($this->_mime_settings[$info['mime']])) {
// можно возвращать дефолтную картинку
// .. и удалять лишние картинки
//$files = glob("{$name}_*{$ext}");
//glob("*.txt")

exit;
}
$settings =& $this->_mime_settings[$info['mime']];

$orig_width = $info[0];
$orig_height = $info[1];
$dst_x = $dst_y = 0;

if (!$this->w) {
// вписываем по высоте
$new_width = $this->w = floor($orig_width * $this->h / $orig_height);
$new_height = $this->h;
}
elseif (!$this->h) {
// вписываем по ширине
$new_width = $this->w;
$new_height = $this->h = floor($orig_height * $this->w / $orig_width);
}
elseif ($this->crop) {
// вписываем с обрезкой
$scaleW = $this->w / $orig_width;
$scaleH = $this->h / $orig_height;
$scale = max($scaleW, $scaleH);
$new_width = floor($orig_width * $scale);
$new_height = floor($orig_height * $scale);
$dst_x = floor(($this->w - $new_width) / 2);
$dst_y = floor(($this->h - $new_height) / 2);
}
else {
// вписываем без обрезки
$scaleW = $this->w / $orig_width;
$scaleH = $this->h / $orig_height;
$scale = min($scaleW, $scaleH);
$new_width = $this->w = floor($orig_width * $scale);
$new_height = $this->h = floor($orig_height * $scale);
}

if ($this->w > $orig_width || $this->h > $orig_height) {
header('Content-type: ' . $info['mime']);
readfile($this->filename);
exit;
}

$thumbFilename = dirname($this->filename) . '/'
. sprintf($this->_tname_tpl, basename($this->filename, $settings['ext']), $this->w, $this->h)
.
$settings['ext']
;


if (file_exists($thumbFilename) && filemtime($thumbFilename) >= filemtime($this->filename)) {
header('Content-type: ' . $info['mime']);
readfile($thumbFilename);
exit;
}

$orig_img = call_user_func($settings['create'], $this->filename);
$tmp_img = imagecreatetruecolor($this->w, $this->h);
// Copy and resize old image into new image
imagecopyresampled(
$tmp_img, $orig_img,
$dst_x, $dst_y,
0, 0,
$new_width, $new_height,
$orig_width, $orig_height
);
imagedestroy($orig_img);
header('Content-type: ' . $info['mime']);
call_user_func($settings['save'], $tmp_img, $thumbFilename);
imagedestroy($tmp_img);
exit;
}

private function _gif_save($img, $filename = false)
{
if ($filename !== false && $this->_fsave_allowed) imagegif($img, $filename);
imagegif($img);
}

private function _jpeg_save(&$img, $filename = false)
{
if ($filename !== false && $this->_fsave_allowed) imagejpeg($img, $filename, $this->_jpeg_quality);
imagejpeg($img, '', $this->_jpeg_quality);
}

private function _png_save($img, $filename = false)
{
if ($filename !== false && $this->_fsave_allowed) imagepng($img, $filename);
imagepng($img);
}

}

new Thumbnail;
?>

Спустя 17 часов, 52 минуты, 7 секунд (16.02.2012 - 12:40) Skesh написал(а):
Цитата (inpost @ 15.02.2012 - 15:11)
Skesh
А если png ?! smile.gif

Дык ему ж вроде всеравно какой формат... главное что бы растровый.

Спустя 4 минуты, 5 секунд (16.02.2012 - 12:44) inpost написал(а):
Skesh
imagejpeg - это функция для jpg.
Прозрачность у тебя для png не указывается, значит будет огромный глюк с этим.

Спустя 3 часа, 10 минут, 30 секунд (16.02.2012 - 15:54) walerus написал(а):
Skesh sad.gif
inpost unsure.gif

Написал готовый универсальный класс, а меня даже и не заметили !!! , больше не буду помогать ph34r.gif

Спустя 13 минут, 18 секунд (16.02.2012 - 16:07) imbalance_hero написал(а):
walerus
Уровень прозрачности и каналов ты не включил для png. Точно такой же баг в классе у Николая smile.gif
Возьми какую-нибудь картинку с переходящей прозрачностью, и попробуй свой класс, он будет обрываться грубо.

Спустя 2 минуты, 1 секунда (16.02.2012 - 16:09) Skesh написал(а):
хммм... а еще так старался прописывал разрешенные форматы для файлов =) спс, буду знать.
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.