Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: imagecopyresized() - плохое качество
Форумы портала PHP.SU » PHP » Программирование на PHP » imagecopyresized() - плохое качество

Страниц (1): [1]
 

1. ZekMan - 23 Августа, 2010 - 21:10:37 - перейти к сообщению
Смысл скрипта в том что бы загрузить картинку, получить превью необходимых размеров.
( остальное еще не доделал ).
PHP:
скопировать код в буфер обмена
  1.  
  2. <form action="" method="post" name="img_folder_edit" enctype="multipart/form-data">
  3. <input name="userfile" type="file" style="width: 200px;" /><input type="submit" name="image_upload" value="UPLOAD" style="margin-left:20px;" />
  4. </form>
  5. <?PHP
  6. if ($_POST['image_upload']){
  7.         $uploaddir = 'image/tmp_image/';
  8.         $extentions = array('1','2','3','6');  
  9.         $userfilesize = $_FILES['file']['size'];
  10.         $maxfilesize = 1024*1024*7;
  11.         $final_w = 200;
  12.         $final_h = 120;
  13.         $file_type = exif_imagetype($_FILES['userfile']['tmp_name']); # определяем тип изображения
  14.         if (in_array($file_type, $extentions) && ($maxfilesize >= $userfilesize)){
  15.                 switch ($file_type) {
  16.                         case '2': $file_type = '.jpg'; break;
  17.                         case '3': $file_type = '.png'; break;
  18.                         case '1': $file_type = '.gif'; break;                  
  19.                         case '6': $file_type = '.bmp'; break;
  20.                         default: print 'Неизвестная ошибка в определении типа файла<br />';
  21.                 }
  22.                 $new_image = 'two'.$file_type;
  23.                 $basename = 'one'.$file_type;
  24.                 move_uploaded_file($_FILES['userfile']['tmp_name'], $uploaddir.$basename); #загружаем картинку
  25.                 $ext = $file_type; # Получаем формат уменьшаемого изображения
  26.                 $size=GetImageSize ($uploaddir.$basename); # получаем размеры картинки
  27.                 $real_h = $size['1'];
  28.                 $real_w = $size['0'];
  29.                 $koe=$real_h/$final_h; # коэффициент высоты
  30.                 $new_w=ceil($real_w/$koe); # новая ширина
  31.                 switch ($ext) {
  32.             case '.jpg': $source = imagecreatefromjpeg($uploaddir.$basename); break;
  33.             case '.gif': $source = imagecreatefromgif($uploaddir.$basename); break;
  34.             case '.png': $source = imagecreatefrompng($uploaddir.$basename); break;                    
  35.             case '.bmp': $source = imagecreatefromwbmp($uploaddir.$basename); break;
  36.                         default: print 'нет таких значений';
  37.         }
  38.                 $thumb = imagecreatetruecolor($new_w, $final_h); #создаем новое изображение
  39.                 imagecopyresized($thumb, $source, 0, 0, 0, 0, $new_w, $final_h, $real_w, $real_h);
  40.         switch ($ext) {
  41.             case '.jpg': imagejpeg($thumb, $uploaddir.$new_image, 100); break;                
  42.             case '.gif': imagegif($thumb, $uploaddir.$new_image);  break;                
  43.             case '.png': imagepng($thumb, $uploaddir.$new_image); break;                
  44.             case '.bmp': imagewbmp($thumb, $uploaddir.$new_image); break;
  45.                         default: print 'нет таких значений';
  46.         }
  47.  
  48.                 # выводы текста        
  49.                 print 'Upload comlete<br />';
  50.                 print $real_w.'x'.$real_h.'<br />';
  51.                 print 'new size'.$new_w.'x'.$final_h.'<br />';
  52.                 print '<img src="'.$uploaddir.$new_image.'">';
  53.                
  54.         } else {
  55.                
  56.                 print 'Размер файла слишком большой или файл имеет не поддерживаемое расщирение';
  57.         }
  58.        
  59. }
  60. ?>
  61.  


Меня беспокоит качества выходного превью...

Исходное изображение: http://itmages[dot]ru/image/view/52074/9b73a011
Полученное изображение: http://itmages[dot]ru/image/view/52075/47dbb8a1

Как можно улучшить качество картинки?
2. movEAX - 23 Августа, 2010 - 21:21:18 - перейти к сообщению
Как вариант попробуйте imagick
3. Uchkuma - 23 Августа, 2010 - 22:02:51 - перейти к сообщению
movEAX пишет:
Как можно улучшить качество картинки?
imagecopyresized() заменить на imagecopyresampled().
4. ZekMan - 23 Августа, 2010 - 22:58:06 - перейти к сообщению
эм... как бе заголовок перечитай...

Цитата:
Описание: imagecopyresampled() - чуть лучше но тоже плохо
5. JustUserR - 24 Августа, 2010 - 13:55:34 - перейти к сообщению
ZekMan пишет:
Как можно улучшить качество картинки?
При использовании графический функций библиотек типа GD они позволяют работать с изображениями различных форматов и фактических размеров причем достаточно унифицированно - это происходит за счет встроенных систем автоматического преобразования форматов и коррекций полученного изображения за счет применения фильтров и графичечких интерполяций Это означает что если вы используете в некоторой графической фукнции ресурсы картинок которые имеют между собой значительные различия в частности разное разрешение или количетсво цветов и форма их представления или схема сжатия - то будет произвелено конвертирование с автоматическим выбором алгоритма что в некоторых случаях может привести к значительному ухудшению качества
В вашем случае причиной ухудшения качества видимо является наложение спектров то есть алиасинга при уменьшеии разрешения изображения - в таком случае применяется фильтр низких частот Можете посмотреть пример иллюстрирующий данный вопрос здесь http://ru[dot]wikipedia[dot]org/wiki/%D0[dot][dot][dot]0%B8%D0%BD%D0%B3
6. ZekMan - 25 Августа, 2010 - 12:38:46 - перейти к сообщению
JustUserR
Спасибо, разобрался, сделал так:
Спойлер (Отобразить)
Ха-ха Ха-ха Ха-ха
7. JustUserR - 26 Августа, 2010 - 09:23:54 - перейти к сообщению
ZekMan пишет:
JustUserR Спасибо, разобрался, сделал так
Пожалуйста! Используемая вами в новой версии PHP-скрипта фукнция для изменения разрешения изображения видимо уже содержит встроенные алгоритмы билинейной интерполции и возможно фильтра низких частот - тем не менее в общем случае для различных графических форматов может получаться разный результат в частности по причине того что способы хранения в них цветовых данных и alpha-каналов а также алгоритмы сжатия существенно отличаются - и сами функции изменения размера изображения как правило имеют отдельные эффективные алгоритмы для каждого из форматов отдельно без приведения к общему виду - таким образом для получения идентичного результата возможно привести изображения в общий формат типа побитовой карты BMP и выполнять для него унифицированный алгоритм изменения расширения и последующего сжатия в требуемый формат

 

Powered by ExBB FM 1.0 RC1