Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > PHP
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.08.2010, 16:46   #1
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию Уменьшить картинку

Хочу уменьшить картинку, но видел только довольно большие коды и не очень в них разобрался.
1. Как самым простым образом при получении файла из формы, в которую пользователь его "загрузил", сжать его, а потом сохранить?
2. Как лучше всего не потерять качество (убрать муар, не допустить левых точек и тд?)

GD есть. А можно и не с GD связанное рассказать, но, наверное, GD - это априорная библиотека, без которой не изменишь картинки.
Krasi вне форума Ответить с цитированием
Старый 01.08.2010, 19:03   #2
Linel
Форумчанин
 
Аватар для Linel
 
Регистрация: 21.02.2009
Сообщений: 372
По умолчанию

GD, на мой взгляд, лучший вариант.
Сам пользуюсь этой библиотекой, например, для создания preview. Позволит уменьшить картинку без больших потерь качества.
No name. Just Linel.
Linel вне форума Ответить с цитированием
Старый 01.08.2010, 19:04   #3
Виталий Желтяков
Старожил
 
Аватар для Виталий Желтяков
 
Регистрация: 19.04.2010
Сообщений: 2,702
По умолчанию

- Сжимаем gzip-ом,
- Сохраняем для jpeg с качеством 0.8
Виталий Желтяков вне форума Ответить с цитированием
Старый 01.08.2010, 19:14   #4
Krasi
Форумчанин
 
Регистрация: 12.02.2010
Сообщений: 787
По умолчанию

А блин, нужен код=) По крайней мере, самого процесса сжатия, до того момента, как получится нечто,что нужно вписать в copy.

Последний раз редактировалось Krasi; 01.08.2010 в 19:17.
Krasi вне форума Ответить с цитированием
Старый 03.08.2010, 16:04   #5
BloodWizard
Пользователь
 
Аватар для BloodWizard
 
Регистрация: 23.10.2008
Сообщений: 46
По умолчанию

PHP код:
function resize($img){ 
if (isset(
$_GET['h'])) $h=$_GET['h']; else $h=150//проверяем заданы ли нужные размеры изображения если нет то ставим задаём их 150 на 150
    
if (isset($_GET['w'])) $w=$_GET['w']; else $w=150;
    
$size=getimagesize($img); // получаем размеры нашего ихображения
    
$src=imagecreatefromjpeg($img); //читаем наше изображения
    
$iw=$size[0]; //записываем размеры в переменные
    
$ih=$size[1];
    if (
$iw==$w && $ih==$h){ //если размеры надо не надо менять то завершаем работу
        
imagejpeg($src);
        
imagedestroy($src);
    }
    else { 
//иначе
        /* есди изображение меньше нужного */
        
if ($iw<$w && $ih<$h){ //решаем по пропорции
            
if ($iw>$ih){
                
$ix=$w;
                
$iy=($w*$ih)/$iw;
            } else 
            if (
$iw<$ih){
                
$ix=($iw*$w)/$ih;
                
$iy=$h;
            }
            else 
            if (
$iw==$ih){
                
$ix=($iw*$w)/$ih;
                
$iy=$h;
            }
        }
        
/* есди изображение больше нужного */
        
if ($iw>$w && $ih>$h){
            if (
$iw>=$ih){
                
$ix=$w;
                
$iy=($w*$ih)/$iw;
            } else 
            if (
$iw<=$ih){
                
$ix=($iw*$w)/$ih;
                
$iy=$h;
            }
            else 
            if (
$iw==$ih){
                
$ix=($iw*$w)/$ih;
                
$iy=$h;
            }
        }
        
/* есди изображение по высоте больше а по ширине меньше*/
            
if ($iw<$w && $ih>$h){
                
$ix=($iw*$w)/$ih;
                
$iy=$h;
        } else 
/* есди изображение по высоте меньше а по ширине больше*/
            
if ($iw>$w && $ih<$h){
                
$ix=$w;
                
$iy=($w*$ih)/$iw;
        } 

        
$dst=imagecreatetruecolor($w$h);// создаём пустое изображение нужных размеров 
        
imagefill($dst000xffffff); //заливаем его белым цветом
        
$bx=round((abs($ix-$w))/2); // определяем откуджа начинать врисовывать наше изображение в создане строкой выще
        
$by=round((abs($iy-$h))/2);
        
imagecopyresampled($dst$src$bx$by00$ix$iyimagesx($src), imagesy($src)); // врисовываем наше уменьшеное изображение в белое
        
imagejpeg($dst); // выводим полученое изображение 
        
imagedestroy($dst); // стираем из памяти изображение
        
}
}
header("Content-type: image/jpg");
$img=$_GET['img'];
resize($img); 
вот код, но его надо немного доработать там уж сам потестируешь и доработаешь...

Последний раз редактировалось BloodWizard; 03.08.2010 в 16:10.
BloodWizard вне форума Ответить с цитированием
Старый 06.08.2010, 02:29   #6
Johnatan
Antimoderаtoris
Участник клуба
 
Регистрация: 08.02.2008
Сообщений: 1,251
По умолчанию

Цитата:
Сообщение от Krasi Посмотреть сообщение
...но видел только довольно большие коды и не очень в них разобрался...
Цитата:
Сообщение от BloodWizard Посмотреть сообщение
PHP код:
...
много кода
... 

Я боюсь автору это не сильно поможет. )))
98% из тысячи моих постов сделаны в профильном подфоруме. Я не накручиваю свои посты болтанием в "курилке", а ты?
Johnatan вне форума Ответить с цитированием
Старый 07.08.2010, 13:40   #7
BloodWizard
Пользователь
 
Аватар для BloodWizard
 
Регистрация: 23.10.2008
Сообщений: 46
По умолчанию

Цитата:
Сообщение от Johnatan Посмотреть сообщение
Я боюсь автору это не сильно поможет. )))
Куда уж меньше код и так не совершенный....
BloodWizard вне форума Ответить с цитированием
Старый 07.08.2010, 20:12   #8
BloodWizard
Пользователь
 
Аватар для BloodWizard
 
Регистрация: 23.10.2008
Сообщений: 46
По умолчанию

Вот нашёл одну ошибку в коде... там когда изображение меньше нужного надо поменять во втором иф
PHP код:
if ($iw<$ih){
$iy=$h;
$ix=($iy*$w)/$ih;} 
BloodWizard вне форума Ответить с цитированием
Старый 07.08.2010, 22:43   #9
InternetStranger
php / delphi
Форумчанин
 
Аватар для InternetStranger
 
Регистрация: 10.06.2007
Сообщений: 175
Радость

Цитата:
Сообщение от BloodWizard Посмотреть сообщение
Куда уж меньше код и так не совершенный....
Не скажи... Меньше можно например сюда:

PHP код:
    // --- Настройки
    
define('WIDTH',200);            // Ширина иконки
    
define('HEIGHT',200);            // Высота иконки
    
define('R',255);define('G',255);define('B',255); // RGB для фонового цвета под иконкой 

    // --- Поехали
    
$imageInfo getimagesize$file );
    switch( 
$imageInfo[2] ){
        case 
1$image imagecreatefromgif$file ); break;
        case 
2$image imagecreatefromjpeg$file ); break;
        case 
3$image imagecreatefrompng$file ); break;
        default: exit();
    }
    
    
//--- Создание иконки фотки 
    
$result imagecreatetruecolor(WIDTH,HEIGHT);
    
$bg imagecolorallocate$resultRG);
    
imagefilledrectangle$result00WIDTH-1HEIGHT-1$bg );
    
    
//--- Вычисляем соотношение сторон для иконки 
    
$ratio1 $imageInfo[0]/WIDTH;
    
$ratio2 $imageInfo[1]/HEIGHT;
    
$ratio $ratio1<$ratio2?$ratio1:$ratio2;  // выбираем наименьшее соотношение
    
    // if ( $ratio<1 ) $ratio=1;          // Оставить иконки меньших размеров WIDTH и HEIGHT не трогать
    
$width  $imageInfo[0]/$ratio;
    
$height $imageInfo[1]/$ratio;
    
imagecopyresampled$result$image00, ($imageInfo[0]-WIDTH*$ratio)/2, ($imageInfo[1]-HEIGHT*$ratio)/2WIDTHHEIGHT$ratio*WIDTH$ratio*HEIGHT); 
      
    
//--- Отправляем (возвращаем) иконку 
    
header('Content-type: image/jpeg');
    
imagejpeg($result); 
Я тут просто фотогалерею замутил на днях. Алгоритм используется для подготовки эскизов (иконок) изображений.
Причем данная версия для того хороша, когда все фотки каких-попало форматов. И все аккуратненько подгоняются под размер WIDTHхHEIGHT. То, что не влазит, обрезается.

Если обрезание (обрезание исходной картинки имеется ввиду) не нужно, т.е. чтобы эскиз со своими "какими-попало" пропорциями просто вписался в прямоугольник WIDTHхHEIGHT.

Достаточно заменить одну строчку:
PHP код:
.....
imagecopyresampled$result$image00, ($imageInfo[0]-WIDTH*$ratio)/2, ($imageInfo[1]-HEIGHT*$ratio)/2WIDTHHEIGHT$ratio*WIDTH$ratio*HEIGHT); 
.....

// вот на эту:
imagecopyresampled$result$image, (WIDTH-$width)/2, (HEIGHT-$height)/200$width$height$imageInfo[0], $imageInfo[1]); 
G.Azamat { Web Development / Computer simulation }
Начинающий программист думает, что в килобайте 1000 байтов, а законченный уверен, что в километре 1024 метра.
InternetStranger вне форума Ответить с цитированием
Старый 08.08.2010, 12:20   #10
BloodWizard
Пользователь
 
Аватар для BloodWizard
 
Регистрация: 23.10.2008
Сообщений: 46
По умолчанию

Зачётная галерея..прокрутка колесом прикальнла!
Код тоже достойный... но мой код по пропорции уменьшает... ничего не режет... просто у меня этот скрипт для создания миниатюрок на сотовые телефоны и поэтому резать не стоит в моём случае и поэтому я вписываю картинку в нужные размеры и всё... слушай раз ты галерею написал не посмотришь вот эту тему http://programmersforum.ru/showthread.php?t=107864 может чего подскажешь...
BloodWizard вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как получить картинку при наведении на другую картинку (ссылку) seeker1 JavaScript, Ajax 8 04.07.2010 19:42
Уменьшить картинку fezilk24 Общие вопросы Delphi 2 12.06.2010 16:45
Уменьшить Bitmap RIO Общие вопросы Delphi 4 05.08.2009 14:39
уменьшить на 1 в по поле gred Microsoft Office Access 0 19.06.2009 22:37
Как уменьшить картинку быстро но без изменения палитры Joker_kpi Общие вопросы Delphi 2 04.06.2007 23:49