[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: Работа с изображениями. Небольшая библиотека.
b00tanik
Предположим у нас есть картинка - foto_1 для новости, id которой хранится в $_POST['news_id], эту картинку надо сохранить в папку, которыя задаются константой PATH_FOTO_NEWS_1, при этом надо ресайзить ее до ширины 200px. Ну, и конечно сохранить ссылку на нее в базе.
Довольно типичная задача, не так ли? Как я предлагаю ее реализовать:

<?php
/* Здесь код, обрабатывающий ошибки */

$foto=new Foto(array(),$db); // создаем объект для фотографии, $db - объект класса PDO
$foto->foto_name=md5(uniqid(mt_rand(),true)); // задаем имя для сохраняемой картинки
if(!empty($_FILES['foto_1']['name'])){
$foto->Load($_FILES['foto_1']) // загружаем
->Resize(200) // делаем ресайз
->Save(PATH_FOTO_NEWS_1)// сохраняем на диске
->SaveDb(TABLE_NEWS_FOTOS, intval($_POST['news_id'])); // сохраняем в базе
}
?>


Основной файл для поддержки синтаксиса:


<?php
require_once('image.php');

class Foto{
public $Image;
private $file_info;
private $db;
private $table;
private $folder;
public $errors;
public $foto_name;


function __construct($file,$db,$table=false,$folder=false){
if(!empty($file['name'])){
$this->Image= new Image(0,0,0,$file['tmp_name'],GetDximageType($file['type']),0,1);
$this->file_info=$file;
}
$this->db=$db;
if($table) $this->table=$table;
if($folder) $this->folder=$folder;
}

/**
* Загрузить фотографию из файла
*
*
@param array ($_FILES) $from
*
@return Foto
*/


function Load($from){
$this->__construct($from,$this->db);
return $this;
}

/**
* Изменить размер
*
*
@param int $width
*
@param int $height
*
@return Foto
*/

function Resize($width, $height=false){
if(is_object($this->Image)){
$this->Image->image_resize($width,$height,true);
}
return $this;
}

/**
* Сохранить
*
*
@param string $folder
*
@param string $name
*
@return Foto
*/


function Save($folder=false,$name=false){
if(!$folder){
if($this->folder){
$folder = $this->folder;
} else {
array_push($this->errors,FOTO_FOLDER_NOT_ASIGN);
return false;
}
}

//генерируем имя фотки
if(!$name) $foto_name=md5(uniqid(mt_rand(),true));
else $foto_name=$name;
$this->foto_name=$foto_name;
// Сохраняем на диске
$this->Image->image_output(0,$folder.'/'.$foto_name.".png");
$foto_errors=$this->Image->get_last_error();
if($foto_errors[0]) array_push($this->errors,$foto_errors[1]);
return $this;
}

function GetLastFotoName(){
return $this->foto_name;
}

//заносим ее в базу
function SaveDb($table, $model_id){
try{
$res=$this->db->prepare("INSERT INTO $table (foto,model_id) VALUES ('$this->foto_name.png', $model_id)");
$good=$res->execute();
} catch (PDOException $e){
if(DEBUG) print "ERROR!!! : ".$e->getMessage()."<br />";
else array_push($this->errors,DB_ERROR);
}
}


function GetFromDb($table,$model_id){
try{
$res=$this->db->prepare("SELECT foto FROM $table WHERE model_id=$model_id");
$res->execute();
$res=$res->fetchAll(PDO::FETCH_COLUMN);
return $res;
} catch (PDOException $e){
if(DEBUG) print "ERROR!!! : ".$e->getMessage()."<br />";
else array_push($this->errors,DB_ERROR);
}
}

}

?>


image.php не стал выкладывать, т.к. он большой и не мой.

Сами файлы:
foto.php и
image.php
для включения этих возможностей в Ваш проект, просто положите эти файлы в одну папку, и подключите файл foto.php

Прошу ругать.



Спустя 16 минут, 48 секунд (1.04.2010 - 23:39) twin написал(а):
Посмотри тут, может что пригодится.

Спустя 11 минут, 8 секунд (1.04.2010 - 23:50) b00tanik написал(а):
Цитата (twin @ 1.04.2010 - 20:39)
Посмотри тут, может что пригодится.

Немножко разные весовые категории - у Вашего класса больше функции и возможностей настройки, мой - это скорее результат лени.

Хотя есть несколько конструктивных идей, которые я с радостью утащу smile.gif
Быстрый ответ:

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