Модераторы: Aliance, skyboy, MoLeX, ksnk
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> [статья] ThumbClass, или создаем предпросмотры картинок ;) 
V
    Опции темы
gta4kv
Дата 12.2.2008, 15:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

Репутация: 8
Всего: 91



Всем привет!

Эта статья будет посвящена достаточно актуальной (сейчас) теме - созданию предпросмотра картинок. smile

Эта статья расчитана на PHP5, и только 5, иначе код вам придеться модифицировать..

Предисловия я писать не умею, по этому - не буду.

Начнем сразу с кода. ;)

1. "Создадим" класс.
Код

<?php

class ThumbClass
{

Ну тут собственно все понятно.

2. Объявляем переменные
Код

        private $image;
    private $file;
    private $quality = 100;
    private $mimetype;
    private $imageproperties = array( );
    private $initialfilesize;
    private $thumb_url;
    private $add_text;
    private $thumb_created = false;
    public  $error = false;

Здесь:
  • $image; - здесь будет "храниться" картинка.
  • $file; - ссылка на "большой файл".
  • $quality; - качество JPEG картинки.
  • $mimetype; - здесь будет mime type файла.
  • $imageproperties; - здесь результаты функции getimagesize();
  • $initialfilesize; - размер файла.
  • $thumb_url; - имя файла при сохранение предпросмотра.
  • $add_text; - добавлять ли текст на картинку. ( С размером и "весом" файла ).
Теперь пошли функции. smile

Код

public function __construct( $file, $thum_url, $addtext = true, $thumbnailsize = 120  )
    {
        if( !is_file( $file ) )
        {
            return $this->error = true;
        }
        
        $this->thumb_url = $thum_url;
        
        $this->file = $file;
        
        $this->add_text = $addtext;
        
        $this->initialfilesize = filesize( $file );
        $this->imageproperties = getimagesize( $file );
        
        if( !$this->imageproperties )
        {
            return $this->error = true;
        }
        
        $this->mimetype = image_type_to_mime_type( $this->imageproperties[2] );
        
        switch ( $this->imageproperties[ 2 ] )
        {
            case IMAGETYPE_JPEG:
                $this->image = imagecreatefromjpeg( $file );
            break;
            
            case IMAGETYPE_GIF:
                $this->image = imagecreatefromgif( $file );
            break;
            
            case IMAGETYPE_PNG:
                $this->image = imagecreatefrompng( $file );
            break;
            
            default:
                return $this->error = true;
        }
        
        $this->CreateThumb( $thumbnailsize );
    }


Здесь:
  • Проверяем - есть ли файл.
  • Проверяем - это картинка или что.
  • Выясняем - размер файла.
  • Выясняем - mimetype.
  • Выясняем - расширение файла.
  • Вызываем - функцию создание предпросмотра.
Параметры:
  • $file - оригинальный файл.
  • $thum_url - URL будущего предпросмотра.
  • $add_text - добавлять ли текст на картинку? ( true/false )
  • $thumbnailsize - ~ размер предпросмотра.
Код

public function CreateThumb( $thumbnailsize )
    {
        $srcW = $this->imageproperties[ 0 ];
        $srcH = $this->imageproperties[ 1 ];
        
        if( $srcW > $thumbnailsize and $srcH > $thumbnailsize )
        {
            $reduction = $this->calculateReduction( $thumbnailsize );
            
            $desW = ( $srcW / $reduction );
            $desH = ( $srcH / $reduction );
            
            $copy = imagecreatetruecolor( $desW, $desH );
            
            imagecopyresampled( $copy, $this->image, 0, 0, 0, 0, $desW, $desH, $srcW, $srcH );
            
            if( !$copy )
            {
                return $this->error = true; 
            }
                
            $this->image = $copy;
            
            $this->thumb_created = true;    
            
            if( $this->add_text == true )
            {
                $this->addText();
            }
        }        
    }


Здесь:
  • Высчитываем "пропорцию". ( Вызывает функцию $this->calculateReduction( $thumbnailsize ); )
  • Создаем предпросмотр.
  • Если надо - добавляем текст. ( Вызвая функцию $this->addText(); )
Параметры:
  • $thumbnailsize - размер предпросмотра.
Код

public function  calculateReduction( $thumbnailsize )
    {
        $srcW = $this->imageproperties[ 0 ];
        $srcH = $this->imageproperties[ 1 ];
        
        if( $srcW < $srcH )
        {
            $reduction = round( $srcH / $thumbnailsize );
        }
        else 
        {
            $reduction = round( $srcW / $thumbnailsize );
        }
        
        return $reduction;
    }


Здесь:
  • Высчитываем пропорцию.
Параметры:
  • $thumbnailsize - размер предпросмотра.
Код

    public function addText( )
    {
        if( $this->thumb_created == true )    
        {
            $NewX = ( imageSX( $this->image ) );
            $NewY = ( imageSY( $this->image ) );
        
            $ImgX = ( $this->imageproperties[ 0 ] );
            $ImgY = ( $this->imageproperties[ 1 ] );
        
            $black = ( imagecolorallocatealpha ( $this->image, 0, 0, 0, 55 ) );
            $white = ( imagecolorallocate( $this->image, 255, 255, 255 ) );
            
            
            imagefilledrectangle( $this->image, 0, 0 + $NewY - 14, $NewX - 1, $NewY + 12, $black );
            $textOnImage = ( $ImgX. 'x'. $ImgY.'; '. $this->make_file_size( $this->initialfilesize ) . ';' ) ;
            imagestring( $this->image, 1, $NewX / 2-ImageFontWidth( 1 ) * strlen( $textOnImage ) / 2 , $NewY - 12, $textOnImage , $white );    
        }
        else 
        {
             return $this->error = true;
        }
  • Добавляет текст на картинку. ( Пример : 1280x1024. 450kb )
Код

    public function getImage( )
    {
        header("Content-type:" . $this->mimetype );    
        switch ( $this->imageproperties[ 2 ] )
        {
            case IMAGETYPE_JPEG:
                imagejpeg( $this->image, $this->thumb_url, $this->quality );
            break;
            
            case IMAGETYPE_GIF:
                imagegif( $this->image, $this->thumb_url );
            break;
            
            case IMAGETYPE_PNG:
                imagepng( $this->image, $this->thumb_url );
            break;
            
            default:
                imagejpeg( $this->image, $this->thumb_url, $this->quality );
        }
    }


Здесь:
  • Сохраняем картинку.
Код

public function make_file_size( $bytes )
    {
        if ( $bytes > 1073741824 ) 
        {
            return sprintf( '%3.1f Gb', $bytes / 1073741824 );
        }
        else if ( $bytes > 1048576 ) 
        {
            return sprintf( '%3.1f Mb', $bytes / 1048576 );
        } 
        else if ( $bytes > 1024 ) 
        {
            return sprintf( '%3.1f Kb', $bytes / 1024 );
        }
        else
        {
            return sprintf( '%d bytes.', $bytes );
        }
    }    
    
    public function __destruct( ) 
    {
        if( isset( $this->image ) )
        {
            imagedestroy( $this->image );
        }
    }
}
  • Здесь - функция конвертирование размера файлов из байтов в мегабайты/килобайты.
  • "Закрытие" класса. Уничтожение картинки из памяти.
Применение:
Код

$class = new ThumbClass( 'file1.png', 'mfile.png' );
$class->getImage( );
unset( $class );


Вот исходники: http://zaley.in/files/Class.7z

Пример: http://zaley.in

п.с. Не забываем про кнопку [+]  smile  smile 

Это сообщение отредактировал(а) gta4kv - 13.2.2008, 09:06
PM MAIL   Вверх
bars80080
Дата 12.2.2008, 15:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


прапор творюет
****
Награды: 1



Профиль
Группа: Завсегдатай
Сообщений: 12022
Регистрация: 5.12.2007
Где: Königsberg

Репутация: 2
Всего: 315



слушай, здорово у меня браузер матюкается на твои js (ИЕ6),
даже и не позволил ничего сделать

кстати, ротация на 0-350 или всё же 0-360 ?
PM MAIL WWW   Вверх
gta4kv
Дата 12.2.2008, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Walking around mad.
***


Профиль
Группа: Завсегдатай
Сообщений: 1868
Регистрация: 25.7.2006

Репутация: 8
Всего: 91



bars80080, у меня 350. А вообще 360 мона.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | PHP: Графика | Следующая тема »


 




[ Время генерации скрипта: 0.4611 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.