|
|
|
| Добрый день.
Есть функция:
function imageresize($outfile,$infile,$neww,$newh,$quality) {
$size = getimagesize($outfile);
$format = strtolower(substr($size['mime'], strpos($size['mime'], '/')+1));
$im=imagecreatefromjpeg($infile);
$im1=imagecreatetruecolor($neww,$newh);
$alt_breite = imagesx($im);
$alt_hoehe = imagesy($im);
$neu_breite = $neww;
$neu_hoehe = $newh;
$thumb = imagecreatetruecolor($neu_breite, $neu_breite);
$thumb_id = $file;
//===============================================================
// Формирование квадратной миниатюры
//===============================================================
// вырезаем квадратную серединку, если изображение горизонтальное
if ($alt_breite>$alt_hoehe) {
imagecopyresized($im1, $im, 0, 0, round((max($alt_breite,$alt_hoehe)-min($alt_breite,$alt_hoehe))/2), 0, $neu_breite, $neu_breite, min($alt_breite,$alt_hoehe), min($alt_breite,$alt_hoehe));
}
// вырезаем квадратную верхушку, если изображение вертикальное
if ($alt_breite<$alt_hoehe) {
imagecopyresized($im1, $im, 0, 0, 0, 0, $neu_breite, $neu_breite, min($alt_breite,$alt_hoehe), min($alt_breite,$alt_hoehe));
}
// квадратное изображение масштабируется без вырезок
if ($alt_breite==$alt_hoehe) {
imagecopyresized($im1, $im, 0, 0, 0, 0, $neu_breite, $neu_breite, $alt_breite, $alt_hoehe);
}
// Создаем 256-цветную палитру
for ($c=0;$c<256;$c++)
{
$palette[$c] = imagecolorallocate($im1,$c,$c,$c);
}
for ($y=0;$y<$newh;$y++)
{
for ($x=0;$x<$neww;$x++)
{
$rgb = imagecolorat($im1,$x,$y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
//Используем функцию yiq для изменения rgb-палитры нашего цветного изображения, чтобы преобразовать его в серое
$gs = $this->yiq($r,$g,$b);
imagesetpixel($im1,$x,$y,$palette[$gs]);
}
}
imagejpeg($im1,$outfile,$quality);
imagedestroy($im);
imagedestroy($im1);
}
|
И есть проблема. При загрузке изображений большого размера происходит их ресайз и обесцвечивание. Но, если изображение загружено изначально нужного размера, оно не обесцвечивается. Как исправить? | |
|
|
|
|
|
|
|
для: maximum7
(23.10.2009 в 22:34)
| | Надо убрать этот участок кода:
<?
// Создаем 256-цветную палитру
for ($c=0;$c<256;$c++)
{
$palette[$c] = imagecolorallocate($im1,$c,$c,$c);
}
for ($y=0;$y<$newh;$y++)
{
for ($x=0;$x<$neww;$x++)
{
$rgb = imagecolorat($im1,$x,$y);
$r = ($rgb >> 16) & 0xFF;
$g = ($rgb >> 8) & 0xFF;
$b = $rgb & 0xFF;
//Используем функцию yiq для изменения rgb-палитры нашего цветного изображения, чтобы преобразовать его в серое
$gs = $this->yiq($r,$g,$b);
imagesetpixel($im1,$x,$y,$palette[$gs]);
}
}
|
| |
|
|
|
|
|
|
|
для: Саня
(23.10.2009 в 22:45)
| | Мне нужно не только размер изменить, но и обесцветить его | |
|
|
|
|
|
|
|
для: maximum7
(23.10.2009 в 22:57)
| | Если картинка меньше заданных размеров, то она вообще не копируется в $im1. А именно $im1 подвергается обесцвечиванию. Так что нужно добавить ещё одну проверку, которая сравнивает исходный размер с нужным. И если исходный меньше нужного, то копировать в $im1 без изменения размеров. | |
|
|
|
|
|
|
|
для: Саня
(23.10.2009 в 23:23)
| | Как это правильно сделать? | |
|
|
|
|
|
|
|
для: maximum7
(24.10.2009 в 00:47)
| | Я же написал — проверка размеров и простое копирование. | |
|
|
|
|
|
|
|
для: Саня
(24.10.2009 в 10:38)
| | Так:
if ($alt_breite == $neu_hoehe || $alt_hoehe == $neu_breite) {
imagecopyresampled($im1, $im, 0, 0, 0, 0, $neu_breite, $neu_breite, $alt_breite, $alt_hoehe);
}
|
| |
|
|
|
|
 4.4 Кб |
|
|
для: maximum7
(24.10.2009 в 18:00)
| | Разобрался:
function resiz ($f,$src,$w,$h,$q) {
// f - имя файла
// q - качество сжатия
// src - исходное изображение
// dest - результирующее изображение
// w - ширниа изображения
// ratio - коэффициент пропорциональности
$size = getimagesize($f);
$format = strtolower(substr($size['mime'], strpos($size['mime'], '/')+1));
// создаём исходное изображение на основе
// исходного файла и опеределяем его размеры
if ($format == 'jpg' || $format == 'jpeg') $im = imagecreatefromjpeg($src);
if ($format == 'gif') $im = imagecreatefromgif($src);
if ($format == 'png') $im = imagecreatefrompng($src);
$w_src = imagesx($im);
$h_src = imagesy($im);
if ($w_src != $w)
{
// создаём пустую квадратную картинку
// важно именно truecolor!, иначе будем иметь 8-битный результат
$dest = imagecreatetruecolor($w,$w);
// вырезаем квадратную серединку по x, если фото горизонтальное
if ($w_src>$h_src)
imagecopyresized($dest, $im, 0, 0,
round((max($w_src,$h_src)-min($w_src,$h_src))/2),
0, $w, $w, min($w_src,$h_src), min($w_src,$h_src));
// вырезаем квадратную верхушку по y,
// если фото вертикальное (хотя можно тоже серединку)
if ($w_src<$h_src)
imagecopyresized($dest, $im, 0, 0, 0, 0, $w, $w,
min($w_src,$h_src), min($w_src,$h_src));
// квадратная картинка масштабируется без вырезок
if ($w_src==$h_src)
imagecopyresized($dest, $im, 0, 0, 0, 0, $w, $w, $w_src, $w_src);
imagefilter($dest, IMAGE_FILTER_NEGATE);
} else {
// создаём пустую квадратную картинку
// важно именно truecolor!, иначе будем иметь 8-битный результат
$dest = imagecreatetruecolor($w,$w);
imagecopyresized($dest, $im, 0, 0, 0, 0, $w, $w, $w_src, $w_src);
imagefilter($dest, IMAGE_FILTER_NEGATE);
}
// вывод картинки и очистка памяти
imagejpeg($dest,$src,$q);
imagedestroy($dest);
}
|
Но, качество полученных изображений оставляет желать лучшего. Это можно исправить? | |
|
|
|
|
|
|
|
для: maximum7
(24.10.2009 в 22:49)
| | Вместо imagecopyresized() попробуйте imagecopyresampled(). | |
|
|
|
|