[ Поиск ] - [ Пользователи ] - [ Календарь ]
Полная Версия: imagick filesize
EvilDev
Всем привет.
Есть задача. Надо узнать размер изображения, после чего сделать с ним несколько манипуляций (качество, ресайз, поворот....), после чего снова узнать размер файла.
Делаю так:

// Открываю
$this->_imOriginal = new Imagick();
if (!$this->_imOriginal->readImage($filename))
throw new CHttpException(403, 'Ошибка открытия файла');

echo $this->_imOriginal->getImageSize(); // т.1
$this->_imOriginal->setImageCompressionQuality(10); // режем качество
echo $this->_imOriginal->getImageSize(); // т.2


Проблема в том, что мне надо узнать размер файла после его редактирования, но почему то размер в точке 1 == размеру в т.2 o_O
Если даже выполнить writeImage(filename) перед т.2, то все равно 1 == 2.
filesize() дает тот же результат.
Складывается впечатление, что IMagick при сохранении помещает writeImage в отдельный поток... :-(

Помогите решить проблему, уже ен знаю чего делать.



Спустя 6 минут, 18 секунд (9.08.2011 - 10:19) linker написал(а):
setImageCompressionQuality() не влияет на размеры изображения.

Спустя 6 минут, 15 секунд (9.08.2011 - 10:25) EvilDev написал(а):
Т.е.? Там еж качество урезается, размер же должен вроде меньше быть.
А после ресайза
$this->_imOriginal->resizeImage($width, null, Imagick::FILTER_LANCZOS, 0.9);

getImageSize == 0

Спустя 10 минут, 50 секунд (9.08.2011 - 10:36) linker написал(а):
А извините, простите. Попробуй сохранить после редактирования в другой файл и сравнить оригинал с полученным изображением.

Спустя 1 минута, 55 секунд (9.08.2011 - 10:38) Invis1ble написал(а):
linker
так он же вроде и сохраняет... unsure.gif

Спустя 3 минуты, 13 секунд (9.08.2011 - 10:41) linker написал(а):
Ну мне интересно, на сколько это влияет на конечный результат в очном сравнении. У меня нет расширения, иначе у себя бы попробовал (вообще-то я с ним никогда не работал, вполне всегда устраивал стандартный GD).

Спустя 33 минуты, 30 секунд (9.08.2011 - 11:14) EvilDev написал(а):

echo $this->_imOriginal->getImageSize(); // 40Kb

$this->_imOriginal->resizeImage($width, null, Imagick::FILTER_LANCZOS, 0.9);

$this->_imOriginal->writeImage($this->_filename.'NEW');
if (is_file($this->_filename.'NEW'))
echo 'EXIST'; // Срабатывает

echo $this->_imOriginal->getImageSize(); // Пишет 0
echo $this->_imOriginal->getImageLength(); // Пишет 0

echo filesize($this->_filename.'NEW'); // 6Kb

Что с NEW, что без NEW срабатывает только filesize();
Ладно, пусть даже не использовать классовые функции, все расно что то не то творится.

Вот код загрузки:

Yii::import('application.,,,PixUpl');
$pixUpl = new PixUpl();

try {
$pixUpl->Open($fileNameFull);
} catch(Exception $e) {
@unlink($filename);
}

$_whOrig = $pixUpl->getOriginalGeometry();
$infoOriginal = $_whOrig[0] . ' x ' . $_whOrig[1] . ' px | ' . $pixUpl->getOriginalSize();

// Преобразовываем в JPEG
if (@$_POST['toJpeg'])
$pixUpl->ImgToJpeg(@$_POST['jpegQuality']);
else
if (@$_POST['isOptimize']) // Если ен преобразовываем, то оптимизируем, если нужно
$pixUpl->Optimize();

................................................

// Сохраняем
$pixUpl->SaveAs();

.................................................

// Создаем провью
$_whOrig = $pixUpl->getOriginalGeometry();
$infoOriginal = $_whOrig[0] . ' x ' . $_whOrig[1] . ' px | ' . $pixUpl->getOriginalSize();

$pixUpl->CreateThumbnail($infoOriginal);
$pixUpl->SaveThumbAs($prevNameFull);

// Делаем надпись на оригинале
if (@$_POST['isWritePicture'] && !empty($_POST['txtPicture']))
$pixUpl->WriteText(CHtml::encode($_POST['txtPicture']));

$pixUpl->Close();


Размер файла ен меняется %)
Вот код функций:


public function SaveAs($filename = '')
{
if (empty($filename))
$filename = $this->_filename;

$this->_isGIF ?
$this->_imOriginal->writeImages($filename, true) :
$this->_imOriginal->writeImage($filename);
}

public function getOriginalSize($formated = true)
{
if ($formated) {
$size = filesize($this->_filename) / 1024;
if ($size / 1024 >= 1.0) {
$size /= 1024;
$size = round($size, 1);
$size .= ' Mb';
} else {
$size = round($size, 0);
$size .= ' Kb';
}

return $size;
}

return filesize($this->_filename);
}



Ничего не понимаю....
Главное на выходе получается нужное изображение

!!! filesize сработает и покажет правильный размер, если после всех операций, закрыть файлы ($this->_imOriginal->delete())
Но не открывать и закрывать же файлы по 10 раз.. -_-

Спустя 2 минуты, 16 секунд (9.08.2011 - 11:17) Invis1ble написал(а):
EvilDev
Я вспомнил. filesize() кеширует результат (как и еще ряд функций).
Нужно юзать clearstatcache()

Спустя 6 минут, 1 секунда (9.08.2011 - 11:23) EvilDev написал(а):
Цитата (Invis1ble @ 9.08.2011 - 08:17)
EvilDev
Я вспомнил. filesize() кеширует результат (как и еще ряд функций).
Нужно юзать clearstatcache()

Вроде помогло! Спасибо огромное!
Дома протестирую скрипт еще раз, если что, отпишусь

Спустя 2 минуты, 17 секунд (9.08.2011 - 11:25) Invis1ble написал(а):
EvilDev
Пожалуйста.
Сам помню мучался с подобной проблемой в недоумении, пока не узнал про кеширование smile.gif


_____________
HTML5, CSS3, jQuery, Node.js, PHP, Yii, Joomla, MySQL, MongoDb, GIMP
Быстрый ответ:

 Графические смайлики |  Показывать подпись
Здесь расположена полная версия этой страницы.
Invision Power Board © 2001-2024 Invision Power Services, Inc.