Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель MySQL 5. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: создать маленькую картинку
 
 автор: FatBoy   (25.11.2005 в 15:26)   письмо автору
 
 

У меня есть изображение: ВМР, нарисованное клеточками: 20х20 шт, размер клеточек 20х20 рх. Надо получить изображение 20х20 рх (уменьшенное изображение).
Как это сделать?

   
 
 автор: cernos   (25.11.2005 в 15:39)   письмо автору
 
   для: FatBoy   (25.11.2005 в 15:26)
 

Вот код страницы preview.php

<?

$file_name
=$_GET['file'];//Путь к большому файлу
$file_pixel=$_GET['pixel'];

$simg getimagesize($file_name);

$h $file_pixel;
$w $h*$simg[0]/$simg[1];
    
// определим коэффициент сжатия изображения, которое будем генерить
    
$ratio $w/$h;
    
// создадим пустое изображение по заданным размерам
    
$dest_img imagecreatetruecolor($w$h);
    
// зальём его белым цветом
    
imagefill($dest_img000xFFFFFF);
    
// получим размеры исходного изображения
    
$size_img getimagesize($file_name);
    
// получим коэффициент сжатия исходного изображения
    
$src_ratio=$size_img[0]/$size_img[1];

    
// здесь вычисляем размеры, чтобы при масштабировании сохранились
    // 1. Пропорции исходного изображения
    // 2. Исходное изображение полностью помещалось на маленькой копии
    // (не обрезалось)
    
if ($src_ratio>$ratio)
    {
        
$old_h=$size_img[1];
        
$size_img[1]=floor($size_img[0]/$ratio);
        
$old_h=floor($old_h*$h/$size_img[1]);
    }
    else
    {
        
$old_w=$size_img[0];
        
$size_img[0]=floor($size_img[1]*$ratio);
        
$old_w=floor($old_w*$w/$size_img[0]);
    }

    
// исходя из того какой тип имеет изображение
    // выбираем функцию создания
$path_partspathinfo($file_name);

$ext $path_parts["extension"];
switch (
$ext)
{
   case 
"jpg":
   
$src_img imagecreatefromjpeg($file_name);
   break;

   case 
"gif":
   
$src_img imagecreatefromgif($file_name);
   break;

    case 
"png":
   
$src_img imagecreatefrompng($file_name);
   break;

   default:
     break;
   exit();
};
    
// масштабируем изображение    функцией imagecopyresampled()
    // $dest_img - уменьшенная копия
    // $src_img - исходной изображение
    // $w - ширина уменьшенной копии
    // $h - высота уменьшенной копии
    // $size_img[0] - ширина исходного изображения
    // $size_img[1] - высота исходного изображения
    
imagecopyresampled($dest_img$src_img0000$w$h$size_img[0], $size_img[1]);

    
// в зависимости от типа файла выбирвем функцию сохранения в файл
    
switch($ext)
{
 case 
"jpg":
         
header("Content-type: ".image_type_to_mime_type(IMAGETYPE_JPEG));
 
imagejpeg($dest_img);
 break;

 case 
"gif":
  
header("Content-type: ".image_type_to_mime_type(IMAGETYPE_JPEG));
 
imagejpeg($dest_img);
 break;

  case 
"png":
   
header("Content-type: ".image_type_to_mime_type(IMAGETYPE_PNG));
 
imagepng($dest_img);
 break;
 default:
  exit();
 break;
         }


    
// чистим память от созданных изображений
    
imagedestroy($dest_img);
    
imagedestroy($src_img);
?>

Этот код преобразовывает на лету размер изображения, он подходит вам так как у вам размер изображения маленький и сервак сильно нагружаться не должен!

Для вставки уменьшенного изображения на страницу :


<img src="preview.php?file=big.jpg&pixel=20"  title='Уменьшенное изображение'>
Где pixel - размер получаемого изображения
file - путь к графическому файлу


Вот только одно
Возможно использовать только jpg или png файлы
Потому-что на других серверах вряд ли имеются библиотеки для работы с gif и bmp файлами!

   
 
 автор: glsv (Дизайнер)   (25.11.2005 в 20:54)   письмо автору
 
   для: FatBoy   (25.11.2005 в 15:26)
 

Это можно сделать с помощью кода, приведенного cernos-ом.
Но, во первых, для этого к php должна быть подключена библиотека GD и второе: библиотека GD не работает с изображениями в формате BMP - отконвертируйте изображение в один из форматов, с которыми библиотека работает: JPG, GIF, PNG.

   
 
 автор: Lelik   (25.11.2005 в 21:17)   письмо автору
 
   для: FatBoy   (25.11.2005 в 15:26)
 


<?php

 $image 
=$_GET['image'];

 
// Задайте размер какой нужен вам
 
if(!$max_width)
  
$max_width 80;
 if(!
max_width)
  
$max_width80;
 
 
$size GetImageSize($image);
 
$width $size[0];
 
$height $size[1];

 
$x_ratio $max_width $width;
 
$y_ratio $max_height $height;
 if((
$width<= $max_width) && ($height<= $max_height))
  {
   
$tn_width $width;
   
$tn_height $height;
  }
 else if ((
$x_ratio $height) < $max_height)
   {
    
$tn_height ceil($y_ratio $height);
    
$tn_width $max_width;
   }
  else
    {
      
$tn_width ceil($y_ratio $width);
      
$tn_height $max_height;
}

src ImageCreateFromJpeg($image);
$dst ImageCreate($tn_width$tn_height);
ImageCopyResized($dst$src0000$tn_width$tn_height$width$height);
header('Content-type: image/jpeg');
ImageJpeg($dstnull, -1);
ImageDestroy($src);
ImageDestroy($dst);
?>

Но код расчитан на jpeg изображения

   
 
 автор: FatBoy   (26.11.2005 в 09:57)   письмо автору
 
   для: Lelik   (25.11.2005 в 21:17)
 

Огромное спасибо за приведенные примеры, но это все не то.
Мне надо добиться не похожего уменьшенного изображения, а точного соответствия цветов.
Функция ImageCopyResized делает все не так.

надо взять 2 цикла:

  for ($x=0; $x<20; $x++)
  {
    for ($y=0; $y<20; $y++)
    {
     $k=imagecolorat ($image, $x*20+10, $y*20+10);
     imagesetpixel ($img_dst, $x, $y, $k);
    }
  }

но у меня не получается эти циклы привязать к созданию, то есть чего мне писать до них и чего после, чтобы вышла картинка?

   
 
 автор: FatBoy   (28.11.2005 в 14:32)   письмо автору
 
   для: FatBoy   (26.11.2005 в 09:57)
 

Ну помогите, кто разбирается.

   
 
 автор: cernos   (28.11.2005 в 15:07)   письмо автору
 
   для: FatBoy   (26.11.2005 в 09:57)
 

А разве таким образом сохраняются не точные цвета?!
В примерах приведенных выше есть комментарии глядя на которые вы можете разобраться что до, а что после того что вы сделали необходимо писать!

ImageCopyResized - функция специально созданная для уменьшения изображения, которая делает уменьшенную копию изображения!

Чего несвовсем понятно что она делает не так!

   
 
 автор: ComandoS   (02.12.2005 в 14:10)
 
   для: FatBoy   (26.11.2005 в 09:57)
 

попробуй imagecreatetruecolor вместо imagecreate...

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования