Форум Flasher.ru

Форум Flasher.ru (http://www.flasher.ru/forum/index.php)
-   Серверные технологии и Flash (http://www.flasher.ru/forum/forumdisplay.php?f=62)
-   -   ImageCopyResized() Потеря цвета при сжатии изображений (http://www.flasher.ru/forum/showthread.php?t=66498)

50%LameRa 07.07.2005 21:37

ImageCopyResized() Потеря цвета при сжатии изображений
 
Вложений: 1
Вот делаю галерею, начал делать превиюшки(уменьшенные исходные изображения), которые формируются при upload-e на сервер
примерно так:
<?
$img = ImageCreateFromJpeg($_GET{'image'});
$resize = (100*imagesy($img))/Imagesx($img);//здесь 100 это ширина сжатого изображения
$img_small = ImageCreate(100, $resize);
ImageCopyResized($img_small, $img, 0, 0, 0, 0, 100, $resize, Imagesx($img), imagesy($img));
ImageJpeg($img_small), 'small_'.$_GET{'image'}.'.jpg");
?>
Но при этом картинка полностью теряет свои изначальные цвета.
PHP Version 4.3.9 все остальное на приаттаченном файле.
Вот и вопрос: можно как нибудь сжать изображения средствами PHP без потери цвета.

nagash 07.07.2005 23:42

imagecreatetruecolor + imagecopyresampled

Constantine 08.07.2005 11:36

Писал тут функцию для загрузки джпегов для фотогалереи, на выходе вполне приличные результаты получил...
Приму советы по улучшению ;)
Код:

<?php
// Используемые константы
define("UPLOAD", "E:\\InetPub\\...\\photos\\"); // Винды!!!
define("PHOTOPATH", "../photos/");
// Функция
function uploadphoto ($maxthumbsize,$maxlargesize,$name,$path,$field) {
        $result=array();
        if ($_FILES[$field]['error']==0) {               
                $types=array("image/pjpeg", "image/jpeg");
                if (in_array($_FILES[$field]['type'],$types)) {
                        $tmpname="tmp_".md5(date("U")).".jpg";
                        $relpath=($path=="") ? PHOTOPATH : PHOTOPATH.$path."/";
                        $locpath=($path=="") ? UPLOAD : UPLOAD.$path."\\";  // Винды!!!                                       
                        if (move_uploaded_file($_FILES[$field]['tmp_name'], $locpath.$tmpname)) {
                                $message="Файл успешно загружен на сервер.";
                                list($width,$height,$type,$attr) = getimagesize($relpath.$tmpname);
                                $quality=70; // Качество
                                $source=imagecreatefromjpeg($relpath.$tmpname);
                                if ($maxthumbsize>0) {
                                        $ratiothumb=($height/$width > 1) ? $height/$maxthumbsize : $width/$maxthumbsize;
                                        $thumbwidth=intval($width/$ratiothumb);
                                        $thumbheight=intval($height/$ratiothumb);               
                                        $thumb=imagecreatetruecolor($thumbwidth,$thumbheight);                               
                                        imagecopyresampled($thumb,$source,0,0,0,0,$thumbwidth,$thumbheight,$width,$height);
                                        imagejpeg($thumb,$relpath."thumb_".$name.".jpg",$quality);       
                                        imagedestroy($thumb);
                                        $message.="\nСоздано изображение с именем thumb_".$name.".jpg";                                                                                                               
                                }
                                if ($maxlargesize>0) {
                                        $ratiolarge=($height/$width > 1) ? $height/$maxlargesize : $width/$maxlargesize;
                                        if ($height<$maxlargesize&&$width<$maxlargesize) $ratiolarge=1;
                                        $largewidth=intval($width/$ratiolarge);
                                        $largeheight=intval($height/$ratiolarge);                                                                                                                                       
                                        $large=imagecreatetruecolor($largewidth,$largeheight);                                                       
                                        imagecopyresampled($large,$source,0,0,0,0,$largewidth,$largeheight,$width,$height);
                                        imagejpeg($large,$relpath."large_".$name.".jpg",$quality);                                                                               
                                        imagedestroy($large);
                                        $message.="\nСоздано изображение с именем large_".$name.".jpg";
                                }
                                imagedestroy($source);                                                                                                                               
                                @unlink($relpath.$tmpname);
                                $result[0]=0;
                                $result[1]=$message;
                                $result[2]="thumb_".$name.".jpg";
                                $result[3]="large_".$name.".jpg";
                                return $result;
                        } else {
                                $result[0]=6;
                                $result[1]="Ошибка при копировании файла, возможно, отсутствует разрешение на запись в ".$locpath;
                                $result[2]="";
                                $result[3]="";                                                               
                                return $result;       
                        }                                               
                } else {
                        $result[0]=5;
                        $result[1]="Неверный тип файла (".$_FILES[$field]['type'].")";
                        $result[2]="";
                        $result[3]="";                                               
                        return $result;                                               
                }
        } else {
                $errorcode=$_FILES[$field]['error'];
                $result[0]=$errorcode;
                $filerrors=array ( "", "Размер файла превышает допустимый (php.ini)", "Размер файла превышает допустимый (form)", "Файл загружен частично", "Файл не выбран" );
                $result[1]=$filerrors[$errorcode];
                $result[2]="";
                $result[3]="";                               
                return $result;
        }
}
// Вызов
$some_array=uploadphoto($maxthumbsize,$maxlargesize,$name,$path,$field);
// (размер превьюшки (большей стороны) или 0, размер полной фотки (большей строны) или 0, новое имя файла (добавляется префикс), путь относительно констант или "", имя поля из которого происходит загрузка файла)
// Возвращает: (код ошибки, текст ошибки, имя файла превьюшки, имя файла полной фотки)
?>

ЗЫ: В коде появляются лишние пробелы в именах переменных -- убрать!

50%LameRa 08.07.2005 21:50

Просто заменил ImageCreate на imagecreatetruecolor и ImageCopyResized на imagecopyresampled(спасибо разработчикам PHP)

Большое спасибо.
---
P.S.Еще один вопрос опять о галерее
У меня в галерее не только jpeg'и и поэтому приходиться определять тип файла(кстати почему-то exif_imagetype undefinded function :confused: пришлось использовать getimagesize) и потом в зависимости от того какой тип делать imagecreatefrom* нет ли функции которая сама определяла бы тип файла и из него создавала image?
P.P.S.
2Constantine: Не мог бы ты обьяснить смысл строк типа этих
$relpath=($path=="") ? PHOTOPATH : PHOTOPATH.$path."/";
$ratiothumb=($height/$width > 1) ? $height/$maxthumbsize : $width/$maxthumbsize;
Я имею ввиду не в твоем скрипте, а в принципе переменная = (условие) ? значение1 : значение2

Constantine 10.07.2005 23:12

В глобальной $_FILES['field']['type'] как раз и содержится тип файла в зависимости от неё и ветви...
переменная=(если...) то "это" в обратном случает "другое";
Альтернативная запись оператора if ... else

50%LameRa 11.07.2005 19:52

Цитата:

Сообщение от Constantine
В глобальной $_FILES['field']['type'] как раз и содержится тип файла в зависимости от неё и ветви...

Я немного не это имел ввиду, но это не так важно
Цитата:

Сообщение от Constantine
переменная=(если...) то "это" в обратном случает "другое";Альтернативная запись оператора if ... else

:) Благодарю

nagash 12.07.2005 13:07

Цитата:

Сообщение от Constantine
В глобальной $_FILES['field']['type'] как раз и содержится тип файла в зависимости от неё и ветви...

там содержиться тот тип, который передал браузер, чаще всего браузер определяет тип по расширению...

для определения типа надо использовать: http://php.net/getimagesize

Constantine 12.07.2005 13:39

Цитата:

Сообщение от nagash
там содержиться тот тип, который передал браузер, чаще всего браузер определяет тип по расширению...

Согласен, может и не передать, но мне такой хитрый попался, что мало того передает, да ещё и не по расширению определяет ;)


Часовой пояс GMT +4, время: 16:07.

Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2026, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.