|
|
|
| У меня есть изображение: ВМР, нарисованное клеточками: 20х20 шт, размер клеточек 20х20 рх. Надо получить изображение 20х20 рх (уменьшенное изображение).
Как это сделать? | |
|
|
|
|
|
|
|
для: 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_img, 0, 0, 0xFFFFFF);
// получим размеры исходного изображения
$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_parts= pathinfo($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_img, 0, 0, 0, 0, $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 файлами!
|
| |
|
|
|
|
|
|
|
для: FatBoy
(25.11.2005 в 15:26)
| | Это можно сделать с помощью кода, приведенного cernos-ом.
Но, во первых, для этого к php должна быть подключена библиотека GD и второе: библиотека GD не работает с изображениями в формате BMP - отконвертируйте изображение в один из форматов, с которыми библиотека работает: JPG, GIF, PNG. | |
|
|
|
|
|
|
|
для: FatBoy
(25.11.2005 в 15:26)
| |
<?php
$image =$_GET['image'];
// Задайте размер какой нужен вам
if(!$max_width)
$max_width = 80;
if(!max_width)
$max_width= 80;
$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, $src, 0, 0, 0, 0, $tn_width, $tn_height, $width, $height);
header('Content-type: image/jpeg');
ImageJpeg($dst, null, -1);
ImageDestroy($src);
ImageDestroy($dst);
?>
|
Но код расчитан на jpeg изображения | |
|
|
|
|
|
|
|
для: 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
(26.11.2005 в 09:57)
| | Ну помогите, кто разбирается. | |
|
|
|
|
|
|
|
для: FatBoy
(26.11.2005 в 09:57)
| | А разве таким образом сохраняются не точные цвета?!
В примерах приведенных выше есть комментарии глядя на которые вы можете разобраться что до, а что после того что вы сделали необходимо писать!
ImageCopyResized - функция специально созданная для уменьшения изображения, которая делает уменьшенную копию изображения!
Чего несвовсем понятно что она делает не так! | |
|
|
|
|
автор: ComandoS (02.12.2005 в 14:10) |
|
|
для: FatBoy
(26.11.2005 в 09:57)
| | попробуй imagecreatetruecolor вместо imagecreate... | |
|
|
|