Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Список интенсивных курсов: [см.]  
  
Специальные предложения: [см.]  
  
 
Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны
 

Вернуться   Форум Flasher.ru > Flash > Серверные технологии и Flash

Версия для печати  Отправить по электронной почте    « Предыдущая тема | Следующая тема »  
Опции темы Опции просмотра
 
Создать новую тему Ответ
Старый 07.07.2005, 21:37
50%LameRa вне форума Посмотреть профиль Отправить личное сообщение для 50%LameRa Найти все сообщения от 50%LameRa
  № 1  
Ответить с цитированием
50%LameRa
 
Аватар для 50%LameRa

Регистрация: Jun 2005
Адрес: Н.Новгород
Сообщений: 107
По умолчанию ImageCopyResized() Потеря цвета при сжатии изображений

Вот делаю галерею, начал делать превиюшки(уменьшенные исходные изображения), которые формируются при 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 без потери цвета.
Изображения
Тип файла: jpg primer.jpg (27.8 Кб, 63 просмотров)

Старый 07.07.2005, 23:42
nagash вне форума Посмотреть профиль Отправить личное сообщение для nagash Посетить домашнюю страницу nagash Найти все сообщения от nagash
  № 2  
Ответить с цитированием
nagash
Ветеран форума
 
Аватар для nagash

Регистрация: Jul 2001
Адрес: Москва
Сообщений: 3,088
Отправить сообщение для nagash с помощью ICQ
imagecreatetruecolor + imagecopyresampled

Старый 08.07.2005, 11:36
Constantine вне форума Посмотреть профиль Отправить личное сообщение для Constantine Посетить домашнюю страницу Constantine Найти все сообщения от Constantine
  № 3  
Ответить с цитированием
Constantine
 
Аватар для Constantine

Регистрация: Jun 2000
Адрес: $_SERVER['REMOTE_ADDR']
Сообщений: 854
Писал тут функцию для загрузки джпегов для фотогалереи, на выходе вполне приличные результаты получил...
Приму советы по улучшению
Код:
<?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, новое имя файла (добавляется префикс), путь относительно констант или "", имя поля из которого происходит загрузка файла)
// Возвращает: (код ошибки, текст ошибки, имя файла превьюшки, имя файла полной фотки)
?>
ЗЫ: В коде появляются лишние пробелы в именах переменных -- убрать!
__________________
X


Последний раз редактировалось Constantine; 08.07.2005 в 12:17.
Старый 08.07.2005, 21:50
50%LameRa вне форума Посмотреть профиль Отправить личное сообщение для 50%LameRa Найти все сообщения от 50%LameRa
  № 4  
Ответить с цитированием
50%LameRa
 
Аватар для 50%LameRa

Регистрация: Jun 2005
Адрес: Н.Новгород
Сообщений: 107
Просто заменил ImageCreate на imagecreatetruecolor и ImageCopyResized на imagecopyresampled(спасибо разработчикам PHP)

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

Старый 10.07.2005, 23:12
Constantine вне форума Посмотреть профиль Отправить личное сообщение для Constantine Посетить домашнюю страницу Constantine Найти все сообщения от Constantine
  № 5  
Ответить с цитированием
Constantine
 
Аватар для Constantine

Регистрация: Jun 2000
Адрес: $_SERVER['REMOTE_ADDR']
Сообщений: 854
В глобальной $_FILES['field']['type'] как раз и содержится тип файла в зависимости от неё и ветви...
переменная=(если...) то "это" в обратном случает "другое";
Альтернативная запись оператора if ... else
__________________
X

Старый 12.07.2005, 13:07
nagash вне форума Посмотреть профиль Отправить личное сообщение для nagash Посетить домашнюю страницу nagash Найти все сообщения от nagash
  № 6  
Ответить с цитированием
nagash
Ветеран форума
 
Аватар для nagash

Регистрация: Jul 2001
Адрес: Москва
Сообщений: 3,088
Отправить сообщение для nagash с помощью ICQ
Цитата:
Сообщение от Constantine
В глобальной $_FILES['field']['type'] как раз и содержится тип файла в зависимости от неё и ветви...
там содержиться тот тип, который передал браузер, чаще всего браузер определяет тип по расширению...

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

Старый 12.07.2005, 13:39
Constantine вне форума Посмотреть профиль Отправить личное сообщение для Constantine Посетить домашнюю страницу Constantine Найти все сообщения от Constantine
  № 7  
Ответить с цитированием
Constantine
 
Аватар для Constantine

Регистрация: Jun 2000
Адрес: $_SERVER['REMOTE_ADDR']
Сообщений: 854
Цитата:
Сообщение от nagash
там содержиться тот тип, который передал браузер, чаще всего браузер определяет тип по расширению...
Согласен, может и не передать, но мне такой хитрый попался, что мало того передает, да ещё и не по расширению определяет
__________________
X

Старый 11.07.2005, 19:52
50%LameRa вне форума Посмотреть профиль Отправить личное сообщение для 50%LameRa Найти все сообщения от 50%LameRa
  № 8  
Ответить с цитированием
50%LameRa
 
Аватар для 50%LameRa

Регистрация: Jun 2005
Адрес: Н.Новгород
Сообщений: 107
Цитата:
Сообщение от Constantine
В глобальной $_FILES['field']['type'] как раз и содержится тип файла в зависимости от неё и ветви...
Я немного не это имел ввиду, но это не так важно
Цитата:
Сообщение от Constantine
переменная=(если...) то "это" в обратном случает "другое";Альтернативная запись оператора if ... else
Благодарю

Создать новую тему Ответ Часовой пояс GMT +4, время: 17:21.
Быстрый переход
  « Предыдущая тема | Следующая тема »  
Опции темы
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


 


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


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