[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Как изменить размеры графических файлов?
Владимир55
Имеются файлы неизвестного размера в форматах JPG, GIF и PNG.

Как можно средствами РНР изменить размер каждого файла таким образом, чтобы сохранить его пропорции, но при этом высота стала равной 100рх?
GET
$size = GetImageSize($old_image);//параметры картинки, $size[2] - ее тип
$k=$size[0]/$size[1];//отношение ширины к высоте

$new_hight=100;//новая высота
$new_width=$new_hight*$k;//новая ширина


Примерно так я думаю.

_____________
Не тот велик, кто не падал, а тот кто падал и поднимался.
sergeiss
Владимир55, функция http://ru2.php.net/manual/ru/function.getimagesize.php тебе в помощь и библиотека GD2 http://ru2.php.net/manual/ru/book.image.php
Там много чего можно сделать, не только изменение размеров.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Владимир55
Спасибо!
И ссылки отличные, и тема интересная!

А вот такой вопросик остался.

С помощью GetImageSize реальные размеры узнали и новые размеры вычислили. Осталось только из старого файла создать новый файл с вычисленными размерами.

Как это сделать?
sergeiss
Цитата (Владимир55 @ 1.05.2014 - 10:55)
Осталось только из старого файла создать новый файл с вычисленными размерами.

Ну так я ж тебе ссылку дал на библиотеку! Там к каждой функции примеры есть. Например, http://ru2.php.net/manual/ru/function.imagegif.php Сначала уменьшаешь размер, потом выводишь.

_____________
* Хэлп по PHP
* Описалово по JavaScript
* Хэлп и СУБД для PostgreSQL

* Обучаю PHP, JS, вёрстке. Интерактивно и качественно. За разумные деньги.

* "накапливаю умение телепатии" (С) и "гуглю за ваш счет" (С)

user posted image
Владимир55
Да, примеры там есть, но они какие-то другие. У меня, вроде бы, самая простая задача, а под нее примера нет.

Можете Вы привети пример хотя бы для GIF?
AllesKlar
Владимир55
Цитата
У меня, вроде бы, самая простая задача, а под нее примера нет.
Можете Вы привети пример хотя бы для GIF


Это называется "Сделайте за меня, пожалуйста"
Тебе же дали ссылку на список функций.
Бери ручку, листик, и выписывай те, которые, по твоему мнению, могут тебе помочь.

Далее тестируй каждую, смотри результат, оно или нет.

Тебе нужно примерно следующее:
узнать_размер_изображения();
вычислить_размер_для нового изображения(); // твоя собственная функция
создать_новое_пустое_изображение();
скопировать_в_новое_изображение_страое_с_изменением_размера_старого();

Дерзай wink.gif


_____________
[продано копирайтерам]
Владимир55
Цитата
скопировать_в_новое_изображение_страое_с_изменением_размера_старого();

Собственно, это есть камень преткновения.
Ser18
Посмотри этот класс


class UploadImages{
private $_file;
private $_adres;
private $_name_final = false;
private $_error = false;

private $_weight = 0;
private $_height = 0;

private $_weight_final = 0;
private $_height_final = 0;

private $_weight_max = 0;
private $_height_max = 0;
private $_permitted = array('image/gif',
'image/jpeg',
'image/pjpeg',
'image/png');

public function __construct($f){
$this->_file = current($f);
$this->_setErrorUpload($this->_file['error']);
}
// Задаем адрес куда загружаем картинку
public function setAdres($a){
$this->_adres = $a;
}
//Задаем максимальные размеры картинки
public function setMaxSize($w_max, $h_max){
$this->_weight_max = $w_max;
$this->_height_max = $h_max;
}
// Загружаем картинку на сервер
public function uploadImg(){
if(!empty($this->_error)){
return false;
}
$imageinfo = getimagesize($this->_file['tmp_name']);
$permitted = $this->_permittedValide($imageinfo['mime']);

$this->_weight = $imageinfo[0];
$this->_height = $imageinfo[1];

if($this->_weight_max > 0 or $this->_height_max > 0){
$this->_getSize($imageinfo[0], $imageinfo[1]);
}else{
$this->_weight_final = $imageinfo[0];
$this->_height_final = $imageinfo[1];
}
$name = $this->_getRandomName();
switch($permitted){
case 'jpg': $this->_jpgLoad($this->_file['tmp_name'], $name); break;
case 'jpeg': $this->_jpgLoad($this->_file['tmp_name'], $name); break;
case 'gif': $this->_gifLoad($this->_file['tmp_name'], $name); break;
case 'png': $this->_pngLoad($this->_file['tmp_name'], $name); break;
default: $this->_error = 'Неверный тип файла'; break;
}
return true;
}
//Уменьшаем картинку до нужных размеров сохраняя пропорции
private function _getSize($weight, $height){
$res;
if($weight > $this->_weight_max and $this->_weight_max > 0){
$ratio = $this->_weight_max/$weight;
$height = round($height*$ratio);
$weight = $this->_weight_max;
}
if($height > $this->_height_max and $this->_height_max > 0){
$ratio = $this->_height_max/$height;
$weight = round($weight*$ratio);
$height = $this->_height_max;
}
$this->_weight_final = $weight;
$this->_height_final = $height;
return true;
}
// Получаем финальные размеры картинки
public function getImgSize(){
$res = array();
$res['w'] = $this->_weight_final;
$res['h'] = $this->_height_final;
return $res;
}
// Проверяем раширение картинки
private function _permittedValide($p){
if(empty($this->_permitted) or empty($p)){return false;}
for($i = 0; count($this->_permitted) > $i; $i++){
if($this->_permitted[$i] === $p){
$perm = explode("/", $p);
return $perm[1];
}
}

return false;
}
// Проверяем есть ли ошибки при загрузке файла
private function _setErrorUpload($upload){
switch($upload){
case 1: $this->_error = 'Размер загружаемого файла превышает максимальный размер ini'; break;
case 2: $this->_error = 'Размер загружаемого файла превышает максимальный размер MAX_FILE_SIZE'; break;
case 3: $this->_error = 'Файл загружен частично'; break;
case 4: $this->_error = 'Данные формы загружены без указания файла'; break;
case 6: $this->_error = 'Временная папка отсутствует'; break;
case 7: $this->_error = 'Файл невозможно записать на диск'; break;
case 8: $this->_error = 'Процесс загрузки остановлен неопределенным PHP-расширением'; break;
}
}

// Получаем ошибку
public function getError(){
return $this->_error;
}
// Получам случайное имя для файла
private function _getRandomName(){
return time().rand(1, 100);
}
public function getNameFinal(){
if(!empty($this->_name_final)){
return $this->_name_final;
}else{
return false;
}
}

// Загкужаем файлы JPG
private function _jpgLoad($tmp_name, $name){
$res = true;
$src_img = imagecreatefromjpeg($tmp_name);
$dst = imagecreatetruecolor($this->_weight_final, $this->_height_final);
imagecopyresampled($dst,
$src_img,
0,
0,
0,
0,
$this->_weight_final,
$this->_height_final,
$this->_weight,
$this->_height);
if(!imagejpeg($dst, $this->_adres.$name.'.jpg')){
$this->_error = 'Ошибка при загрузке файла.';
$res = false;
}
imagedestroy($src_img);
imagedestroy($dst);
$this->_name_final = $name.'.jpg';
return $res;
}
// Загкужаем файлы PNG
private function _pngLoad($tmp_name, $name){
$res = true;
$src_img = imagecreatefrompng($tmp_name);
$dst = imagecreatetruecolor($this->_weight_final, $this->_height_final);
imagecopyresampled($dst,
$src_img,
0,
0,
0,
0,
$this->_weight_final,
$this->_height_final,
$this->_weight,
$this->_height);
if(!imagepng($dst, $this->_adres.$name.'.png')){
$this->_error = 'Ошибка при загрузке файла.';
$res = false;
//exit();
}
imagedestroy($src_img);
imagedestroy($dst);
$this->_name_final = $name.'.png';
return $res;
}
// Загкужаем файлы GIG
private function _gifLoad($tmp_name, $name){
$res = true;
$src_img = imagecreatefromgif($tmp_name);
$dst = imagecreatetruecolor($this->_weight_final, $this->_height_final);
imagecopyresampled($dst,
$src_img,
0,
0,
0,
0,
$this->_weight_final,
$this->_height_final,
$this->_weight,
$this->_height);
if(!imagegif($dst, $this->_adres.$name.'.gif')){
$this->_error = 'Ошибка при загрузке файла.';
$res = false;
}
imagedestroy($src_img);
imagedestroy($dst);
$this->_name_final = $name.'.gif';
return $res;
}
}


if(!empty($_FILES)){
$a = new UploadImages($_FILES);
$a->setMaxSize(0, 300);
$a->setAdres('C:\images\\');
$a->uploadImg();
$size = $a->getImgSize();

echo 'w = '.$size['w'].' | h = '.$size['h'].'<br/>';
echo $a->getError();
}
Быстрый ответ:

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