измененное изображение имеет черный квадрат - PullRequest
3 голосов
/ 23 января 2012

Я пытаюсь завершить эту функцию, кажется, что она отлично работает, за исключением одной маленькой проблемы - кажется, что изображение слишком далеко влево, а затем заполняет остальное пространство черным.

что я пытаюсь сделать, это заставить эту функцию изменить размер изображения до указанного $ thumb_w, и если высота будет больше, чем $ thumb_h после изменения размера, она просто обрезает дно.

Вот мой код функции:

function resize_upload ($tmp, $thumb_w, $thumb_h, $img_name, $img_ext, $img_path)
{
    if ($img_ext == 'jpg' || $img_ext == 'jpeg' || $img_ext == 'png' || $img_ext == 'gif')
    {
        if ($img_ext == 'jpg' || $img_ext == 'jpeg')
            $source_img = imagecreatefromjpeg($tmp);
        else if ($img_ext=='png')
            $source_img = imagecreatefrompng($tmp);
        else 
            $source_img = imagecreatefromgif($tmp);

        $orig_w = imagesx($source_img);
        $orig_h = imagesy($source_img);

        $w_ratio = ($thumb_w / $orig_w);
        $h_ratio = ($thumb_h / $orig_h);

        if ($orig_w > $orig_h ) 
        {
            $crop_w = round($orig_w * $h_ratio);
            $crop_h = $thumb_h;
            $src_x = ceil( ( $orig_w - $thumb_w ) / 2 );
            $src_y = 0;
        } 
        elseif ($orig_w < $orig_h ) 
        {
            $crop_h = round($orig_h * $w_ratio);
            $crop_w = $thumb_w;
            $src_x = 0;
            $src_y = ceil( ( $orig_h - $thumb_h ) / 2 );
        } 
        else 
        {
            $crop_w = $thumb_w;
            $crop_h = $thumb_h;
            $src_x = 0;
            $src_y = 0;
        }

        $thumb_img = imagecreatetruecolor($thumb_w,$thumb_h);

        imagecopyresampled($thumb_img, $source_img, 0 , 0 , $src_x, $src_y, $crop_w, $crop_h, $orig_w, $orig_h);

        imagejpeg($thumb_img, $img_path.'/'.$img_name.'.'.$img_ext, 100);

        imagedestroy($thumb_img);
        imagedestroy($source_img);
    }
}

вот как я вызываю функцию:

resize_upload ($_FILES['image_main']['tmp_name'], 556, 346, $img_name, $img_ext, '../wp-content/themes/my-theme/images/projects');

вот как выглядит изображение в итоге после того, как функция выполняет свою функцию:

enter image description here

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

1 Ответ

4 голосов
/ 23 января 2012

Используя те же переменные из вашего поста $thumb_w = 556, $thumb_h = 346, давайте предположим, что изображение, которое было отправлено, было точно такого же размера, и, следовательно, не должно нуждаться в изменении размера (556x346).

    $orig_w = 556;
    $orig_h = 346;

    $w_ratio = 1;
    $h_ratio = 1;

    if (556 > 346) //true
    {
        $crop_w = round(556 * 1); // 556
        $crop_h = 346;
        $src_x = ceil( ( 556 - 346 ) / 2 ); // ceil( 210 / 2 ) == 105;
        $src_y = 0;
    } 

    ...

    $thumb_img = imagecreatetruecolor(556, 346);

    imagecopyresampled($thumb_img, $source_img, 0, 0, 105, 0, 556, 346, 556, 346);

Итакваш код начинается с x = 105 исходного изображения и пытается перейти на 556 пикселей вправо, но за этой точкой существует только 451 пиксель.Таким образом, если бы я отправил изображение размером 556x346, он скопировал бы ширину пикселей от 105 до 556 для горизонтальной части изображения, а затем от 0 до 346 для вертикальной.Таким образом, отображается весь вертикальный фрагмент изображения, но не вся ширина.

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

Подсказка: При написании формул и других вещей, требующих большого количества вычислений, просматривайте их с простейшими числамипервый.Если они не работают, вы, очевидно, сделали что-то не так.

...