GD: На локалке - работает, на сервере - нет

Ugnich_Andrey

Новичок
GD: На локалке - работает, на сервере - нет

Здравствуйте!
Использую следующий код для создания картинки:
PHP:
<?php

// crop.php Call it like this :
// <img src="crop_img.php?x=10&y=20&w=30&h=40&src=photo.jpg"> 
/*
$w=$_GET['w'];
$h=isset($_GET['h'])?$_GET['h']:$w;    // h est facultatif, =w par defaut
$x=isset($_GET['x'])?$_GET['x']:0;    // x est facultatif, 0 par defaut
$y=isset($_GET['y'])?$_GET['y']:0;    // y est facultatif, 0 par defaut
*/
$x=0;
$y=0;
$w=600;
$h=450;
$filename=$_GET['src'];
$image = imagecreatefromjpeg($filename); 
$crop = imagecreatetruecolor($w,$h);
imagecopy ( $crop, $image, 0, 0, $x, $y, $w, $h );
header('Content-type: image/jpeg');
//header('Content-Disposition: attachment; filename='.$src);
imagejpeg($crop);
imagedestroy($image);
imagedestroy($crop);
?>
Взял из комментов в мануале, немножко поправил под свои нужды. Изначальное изображение большое, просто беру от него кусок 600х450.
Все работает хорошо... на локалке. А на сервере тишина. Крестик вместо изображения.
Вызываю: crop_img.php?src=photo.jpg. GD на сервере есть. И работает.

Может я что-то упустил из виду? Подскажите, пожалуйста.
 

antson

Новичок
Партнер клуба
размер оперативки для выполнения скрипта у хостера.
в память должны умещаться исходная картинка и промежуточные буферы приобразования.

как пример простой ресайз картинки . при дефолтах в 8 м ресайзяться те что до 3-4 метров.
открой картинку в фотошопе и посмотри размер.
посмотри ограничение у хостера.

-~{}~ 02.10.06 16:44:

а еще лучше сперва глянуть в еррор лог . там скорее всего и идет сообщение о нехватке памяти
 

Ugnich_Andrey

Новичок
Максимальный размер катинок - 380 КБ.
Как посмотреть ограничение? phpinfo? Если, да, то где именно?
 

antson

Новичок
Партнер клуба
380 КБ размер файла джипега ?
а речь идет о ширина*высота * глубина цвета.
Открой в фотошопе он напишет сколько метров картинка.
 

tony2001

TeaM PHPClub
header('Content-type: image/jpeg'); - это убери
и зайди на crop_img.php?x=10&y=20&w=30&h=40&src=photo.jpg браузером, всё сам увидишь.
 

Ugnich_Andrey

Новичок
antson
Открыл. 2,25.
tony2001
Убрал. Крестик пропал. Вижу белую страницу. Заходил браузером :) По данному тобой адресу :)

Ситуация не изменилась. Локалка - :); Сервер - :(
 

Ugnich_Andrey

Новичок
Включил. Их Нет.
Текущее состояние скрипта, буква в букву:
PHP:
<?php
Error_Reporting(E_ALL);
// crop.php Call it like this :
// <img src="crop_img.php?x=10&y=20&w=30&h=40&src=photo.jpg"> 
/*
$w=$_GET['w'];
$h=isset($_GET['h'])?$_GET['h']:$w;    // h est facultatif, =w par defaut
$x=isset($_GET['x'])?$_GET['x']:0;    // x est facultatif, 0 par defaut
$y=isset($_GET['y'])?$_GET['y']:0;    // y est facultatif, 0 par defaut
*/
$x=0;
$y=0;
$w=600;
$h=450;
$filename=$_GET['src'];
$image = imagecreatefromjpeg($filename); 
$crop = imagecreatetruecolor($w,$h);
imagecopy ( $crop, $image, 0, 0, $x, $y, $w, $h );
//header('Content-type: image/jpeg');
//header('Content-Disposition: attachment; filename='.$src);
imagejpeg($crop);
imagedestroy($image);
imagedestroy($crop);
?>
Ошибка появляется только если вызвать скрипт без параметра src, а именно: Undefined index: src in z:\home\testarea\www\crop\crop_img.php on line 15.

??? :(
 

Фанат

oncle terrible
Команда форума
выведи на экран значения всех переменных.
короче - отлаживай. за тебя это всё равно никто не сделает.
вот, один гадатель попытался угадать, да ничего у него не вышло. так что, дальше тебе придётся самому.
 

Ugnich_Andrey

Новичок
Вывел все на всех этапах:
PHP:
$x=0;
$y=0;
$w=600;
$h=450;
$filename=$_GET['src'];
echo "x=$x; y=$y; w=$w; h=$h;<br>";
echo "filename: $filename; image: $image; crop: $crop;<br>";
$image = imagecreatefromjpeg($filename); 
echo "x=$x; y=$y; w=$w; h=$h;<br>";
echo "filename: $filename; image: $image; crop: $crop;<br>";
$crop = imagecreatetruecolor($w,$h);
echo "x=$x; y=$y; w=$w; h=$h;<br>";
echo "filename: $filename; image: $image; crop: $crop;<br>";
imagecopy($crop, $image, 0, 0, $x, $y, $w, $h);
echo "x=$x; y=$y; w=$w; h=$h;<br>";
echo "filename: $filename; image: $image; crop: $crop;<br>";
Получил на локалке:
x=0; y=0; w=600; h=450;
filename: photo.jpg; image: ; crop: ;
x=0; y=0; w=600; h=450;
filename: photo.jpg; image: Resource id #2; crop: ;
x=0; y=0; w=600; h=450;
filename: photo.jpg; image: Resource id #2; crop: Resource id #3;
x=0; y=0; w=600; h=450;
filename: photo.jpg; image: Resource id #2; crop: Resource id #3;

На сервере:
x=0; y=0; w=600; h=450;
filename: photo.jpg; image: ; crop: ;
x=0; y=0; w=600; h=450;
filename: photo.jpg; image: Resource id #1; crop: ;
x=0; y=0; w=600; h=450;
filename: photo.jpg; image: Resource id #1; crop: ;
x=0; y=0; w=600; h=450;
filename: photo.jpg; image: Resource id #1; crop: ;

Т.е.:
Resource id # - на локалке - 2-3; на сервере - 1.
И $crop на сервере остается пустым... в чем может быть причина?
 

antson

Новичок
Партнер клуба
<?
$filename='photo/picprod_78.jpg';
$size = getimagesize ($filename);
$byteForPixel=3 ; // глубина цвета . 3 - соответствует режиму 8бит на канал в моделе RGB
echo ($size[0]*$size[1]*$byteForPixel)/1024/1024 . 'M';
?>
И если на твоей картинке выведет больше чем 40% оперативки доступной скрипту, то картинка не отрисуется
 

Ugnich_Andrey

Новичок
Получил и на локалке и на серваке 3.515625M.
А как проверить доступную оперативку?
По идее 8М (как тут написано). Тогда 43,85%.
Может, я не тем путем иду?
Еще как-то можно кусок от большой картинки отрезать?
 

Фанат

oncle terrible
Команда форума
очень странно система твоя себя ведёт.
если imagecreatetruecolor не может создать изображение, то происходит ошибка.
если происходит ошибка, то она должжна вывестись.
теоретически, судя по тому, что у тебя выводится нотис, ошибки у тебя должны выводиться.
Тут одно из двух. Либо в системе какие-то странные проблемы, либо ты что-то делаешь не так, как здесь описал. Я склоняюсь к последнему.

В любом случае, надо не ламера antson-а слушать с его гаданиями и камланиями, а искать способ увидеть сообщение об ошибке.
 

Ugnich_Andrey

Новичок
Сделал так:
PHP:
Error_Reporting(E_ALL);
$w=600;
$h=450;
$filename=$_GET['src'];

$image = imagecreatefromjpeg($filename);
$crop = imagecreatetruecolor($w,$h);
header('Content-type: image/jpeg'); // Эту строчку рекомендовали убрать, но без нее на серваке пустая стр.
imagejpeg($crop);
На локалке черный прямоугольник 600х450
На сервере - крестик размером 1280х960
Интереснейшее явление... Ошибок нет
 

antson

Новичок
Партнер клуба
Ugnich_Andrey
млин как сказал Фанат камлать можно долго.
вот тебе вопросы. ответишь на них поймешь в чем дело
1) ты нашел свой error.log на серваке у хостера
ибо если ошибка по памяти она будет только в логе апача
2) в phpinfo ты проверил реальный memory limit или все еще веришь в дефолты
3) ты попробывал у хостера вырезать кусок из картинки меньшего размера( например 800 на 600

4) ты попробывал просто работает ли
$crop = imagecreatetruecolor(600,450);
echo $crop;

5) понял ли ты откуда в моей формуле была 3 на глубину цвета
и проверил как я сразу говорил . в фотошопе реальный размер картинки в памяти , а не 360к джипега на диске.


Если же я был прав, то мемори лимит окажется на уровне 4М
или у тебя картинка с 16битами на канал и в памяти она не 3,5 а все 7 метров.
 

Ugnich_Andrey

Новичок
hermit_refined
ДА!
Вот только в смысле "нет" :( : Warning: imagecreatetruecolor(): requires GD 2.0 or later

Спасибо всем большое. Простите за потраченое время...
Буду теперь искать другой путь.
 

Фанат

oncle terrible
Команда форума
вообще-то, он писал, что у него выводится нотис.
Ошибка появляется только если вызвать скрипт без параметра src, а именно: Undefined index: src in z:\home\testarea\www\crop\crop_img.php on line 15.
и вот теперь я в непонятках - в какой момент он нам врал, а, главное - зачем.
 
Сверху