PHP Помогите уменьшить картинку!

G
На сайте с 05.09.2009
Offline
1
1059


header ("Content-type: image/jpeg");
$im = @imagecreatefromjpeg ("05.jpg");
if ($im) { /* проверить, удачно ли */
$ldx = imagesx($im); #width $im
$ldy = imagesy($im); #height $im
$prop = $ldx/$ldy; #Width/height [default 4/3]
$dx = 160; #width for small
$dy = $dx/$prop; #height for small
$dm=imagecreate ($dx, $dy);
# imagecopyresampled ($dm, $im, 1, 1, 0, 0, $dx, $dy, $ldx, $ldy); #уменьшаем
imagecopyresized ($dm, $im, 0, 0, 0, 0, $dx, $dy, $ldx, $ldy); #уменьшаем
imagejpeg($dm);
imagedestroy ($dm);
}

Картинка есть, с нужным размером. Но качество-о-о-о...

Natura sanat (http://feeds.feedburner.com/GoendBlog) В этой жизни Вы должны быть либо правы, либо счастливы. mr. Goend (http://goend.ru)
[Удален]
#1

goend, imagick погугли.

G
На сайте с 05.09.2009
Offline
1
#2
bearman:
goend, imagick погугли.

Есть такое, только я в СИ (или чё там с *.c *.h) не втыкаюсь

Да и, видимо, это extension

как я его на сервер воткну?

Prior
На сайте с 03.03.2008
Offline
194
#3

Пропробуйте эту функцию. Качество конечно теряется, но не то, чтобы сильно.

function SaveResized ($sSource, $sDest, $iMaxX, $iMaxY, $iRGB=0xFFFFFF, $iQuality=100){

if (!file_exists($sSource)) return -1; //file not found
$aImgSize = getimagesize($sSource);
if ($aImgSize === false) return -2; //getimgsize error
$sMime = strtolower(substr($aImgSize['mime'], strpos($aImgSize['mime'], '/')+1));
$fcImageCreateFrom = "imagecreatefrom" . $sMime;
if (!function_exists($fcImageCreateFrom)) return -3; //unknown format
$fXRatio = $iMaxX / $aImgSize[0];
$fYRatio = $iMaxY / $aImgSize[1];
$fRatio = min($fXRatio, $fYRatio);
$fUseRatio = ($fXRatio == $fRatio);
$iNewWidth = $fUseRatio ? $iMaxX : floor($aImgSize[0] * $fRatio);
$iNewHeight = !$fUseRatio ? $iMaxY : floor($aImgSize[1] * $fRatio);
$iNewLeft = $fUseRatio ? 0 : floor(($iMaxX - $iNewWidth) / 2);
$iNewTop = !$fUseRatio ? 0 : floor(($iMaxY - $iNewHeight) / 2);
$rImg = $fcImageCreateFrom($sSource);
$rImgDest = imagecreatetruecolor($iMaxX, $iMaxY);
imagefill($rImgDest, 0, 0, $iRGB);
imagecopyresampled($rImgDest, $rImg, $iNewLeft, $iNewTop, 0, 0,
$iNewWidth, $iNewHeight, $aImgSize[0], $aImgSize[1]);
imagejpeg($rImgDest, $sDest, $iQuality);
imagedestroy($rImg);
imagedestroy($rImgDest);
return true;
}
Ответы на вопрос - https://answers.net.pl
G
На сайте с 05.09.2009
Offline
1
#4
Prior:
Пропробуйте эту функцию. Качество конечно теряется, но не то, чтобы сильно.

Спасибо большое!

Достаточно было для цвета imagecreatetruecolor вместо imagecreate -

а эффект - небо и земля!

NB
На сайте с 14.09.2004
Offline
95
#5

Хоть и с опозданием, но процитирую кусочек руководства по PHP (Image Functions, imagecopyresized):

Note: There is a problem due to palette image limitations (255+1 colors). Resampling or filtering an image commonly needs more colors than 255, a kind of approximation is used to calculate the new resampled pixel and its color. With a palette image we try to allocate a new color, if that failed, we choose the closest (in theory) computed color. This is not always the closest visual color. That may produce a weird result, like blank (or visually blank) images. To skip this problem, please use a truecolor image as a destination image, such as one created by imagecreatetruecolor().

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий