Ошибка обрезки изображения PHP - PullRequest
1 голос
/ 18 января 2010

У меня есть небольшой пользовательский модуль drupal, который обрезает изображения профиля пользователя:

$folder = 'sites/default/files/profile_pictures/'.$uid.'/';

$filename = $_POST['filename'];
$orig_w = 480;
$orig_h = $_POST['height'];

$targ_w = 150;
$targ_h = 92;

$ratio = $targ_w / $targ_h;

if(isset($_POST['form_sent']))
{   

    $src = imagecreatefromjpeg($folder.$filename);

    $tmp = imagecreatetruecolor($targ_w, $targ_h);
    imagecopyresampled($tmp, $src, 0,0,$_POST['x'],$_POST['y'],$targ_w,$targ_h,$_POST['w'],$_POST['h']);
    imagejpeg($tmp, $folder.'t_'.$filename,100);

    $full_path = $folder.'t_'.$filename;

    imagedestroy($tmp);
    imagedestroy($src);

    // database stuff

} else {
    return 'Nothing to crop!';
}

95% времени это работает как сон, однако иногда он возвращает черное изображение.

Вот пример проблемы: http://5oup.net/sites/default/files/profile_pictures/405/t_Photo_8.jpg

и оригинальный файл: http://5oup.net/sites/default/files/profile_pictures/405/Photo_8.jpg

Есть идеи, что может пойти не так? Я думаю, что-то в строке imagecreatetruecolor ()?

Заранее спасибо

Джеймс

EDIT

Кажется, я не могу воспроизвести ошибку с оригинальным изображением пользователя, поэтому теперь я действительно не уверен, что вызвало ее в этом случае! Существует функция загрузки изображения перед кадрированием, которая, как я теперь понимаю, также может быть источником ошибки, поэтому в интересах полного раскрытия:

if( isset($_POST['form_sent']) )
{
    $imageFile = $_FILES['image']['tmp_name'];
    $filename = basename( $_FILES['image']['name']);
    $filename = preg_replace("/[^A-Za-z0-9 .]/", '', $filename);
    $filename = str_replace(" ", '_', $filename);

    $filename = urlencode($filename);

    $img_info = getimagesize($imageFile);

    if (filesize($imageFile) > 510000) {
        drupal_set_message('Image too large. Please upload a file 500kb or less.', 'error');
        $image_form = '<a href="/avatar">Choose a different image</a>';
        $output = array(
            'image_form' => $image_form
        );
        return serialize($output);
    }

    list($width, $height) = getimagesize($imageFile);

    switch ($img_info['mime']) {
        case 'image/png':
        $src = imagecreatefrompng($imageFile);
        break;

        case 'image/jpeg':
        case 'image/jpg':
        $src = imagecreatefromjpeg($imageFile);
        break;

        case 'image/gif':
        $src = imagecreatefromgif($imageFile);
        break;

        default:
        drupal_set_message('File type not allowed. Please upload a jpg, gif or png.', 'error');
            $image_form = '<a href="/avatar">Jpg, gif or pngs only</a>';
            $output = array(
                'image_form' => $image_form
            );
            return serialize($output);
        break;
    }

    $orig_h = ($height/$width)* $orig_w;

    $tmp = imagecreatetruecolor($orig_w, $orig_h);
    imagecopyresampled($tmp, $src, 0,0,0,0,$orig_w,$orig_h,$width,$height);
    imagejpeg($tmp, $folder.$filename, 100);

    imagedestroy($tmp);
    imagedestroy($src);     


}

1 Ответ

0 голосов
/ 18 января 2010

Файл не существует. Ваша первая функция переименовывает файлы, если есть пробелы, а затем передает их в функцию масштабирования.

Однако в функции масштабирования вы сбрасываете имя файла на имя сообщения (загруженный файл). Итак, функция отправляется на поиск файла, который не существует (потому что он был переименован), а затем просто возвращает затемненный истинный цвет, который вы создали.

Избавьтесь от кода, сбрасывающего имя файла до исходного (вторая строка в вашей исходной функции), и все будет в порядке. Кроме того, я бы сделал проверку is_file перед созданием эскиза.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...