Создание эскизов и изменение размеров задач - PullRequest
0 голосов
/ 19 февраля 2012

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

enter image description here

И я хотел бы вырезать эту красную область.

Теперь моя проблема в том, что я изменяю размер изображения с помощью html перед кадрированием, поэтому, когда я отправляю данные в php, я получаю неверные значения, например y = 100, когда действительно это может быть y = 200, поэтому мне нужно найти способ рассчитать мои значения.

Я использую imagecopyresampled, может быть, есть что-то лучше этой команды?

Также мое самое близкое решение было таким:

imagecopyresampled(
    $thumb, //Destination image link resource.
    $src,   //Source image link resource.
    0,      //x-coordinate of destination point.
    0,      //y-coordinate of destination point.
    0,      //x-coordinate of source point.
    0,      //y-coordinate of source point.
    120,    //Destination width.
    160,    //Destination height.
    $image_width/2, //Source width.
    $image_height/2  //Source height.
);

В этом случае он будет вырезать левый угол, но размер будет не таким, как у моей красной коробки. Так что я думаю, мне нужно правильно настроить source width и source height, а все остальное должно идеально подходить, в любом случае, я надеюсь, что здесь есть какой-то смысл:)

РЕДАКТИРОВАТЬ Извините, я забыл упомянуть, $image_width и $image_height - исходный размер изображения

РЕДАКТИРОВАТЬ 2 Чтобы быть более понятным, это то, что я получаю, когда я изменяю размер с этим кодом

$dimensions = getimagesize('testas.jpg');

$img = imagecreatetruecolor(120, 160); 
$src = imagecreatefromjpeg('testas.jpg');

imagecopyresampled($img, $src, 0, 0, 0, 0, 120, 160, $dimensions[0]/2, $dimensions[1]/2); 

imagejpeg($img, 'test.jpg');

enter image description here

Размер измененного размера правильный, но, как вы можете, он выглядит неправильно.

Ответы [ 3 ]

1 голос
/ 20 февраля 2012

Я использую что-то подобное для масштабирования изображений:

public static function scaleProportional($img_w,$img_h,$max=50)
{
    $w = 0;
    $h = 0;

    $img_w > $img_h ? $w = $img_w / $img_h : $w = 1;
    $img_h > $img_w ? $h = $img_h / $img_w : $h = 1;

    $ws = $w > $h ? $ws = ($w / $w) * $max : $ws = (1 / $h) * $max;
    $hs = $h > $w ? $hs = ($h / $h) * $max : $hs = (1 / $w) * $max;

    return array(
        'width'=>$ws,
        'height'=>$hs
    );
}

использование:

            $getScale = Common::scaleProportional($prevWidth,$prevHeight,$scaleArray[$i][1]);
            $targ_w = $getScale['width'];
            $targ_h = $getScale['height'];
            $jpeg_quality = 100;

            $src = $prevdest;

            $img_r = imagecreatefromjpeg($src);
            $dst_r = ImageCreateTrueColor( $targ_w, $targ_h );
            //imagecopyresampled(dest_img,src_img,dst_x,dst_y,src_x,src_y,dst_w,dst_h,src_w,src_h);
            imagecopyresampled($dst_r,$img_r,0,0,0,0,$targ_w,$targ_h,$prevWidth,$prevHeight);
            imagejpeg($dst_r, 'assets/images/'.$scaleArray[$i][0].'/'.$filename, $jpeg_quality);
            $complete[] = $scaleArray[$i][0];
0 голосов
/ 19 февраля 2012

Так что через некоторое время я смог сделать это с помощью моего друга, это скрипт, который я использовал, возможно, кому-то он понадобится в будущем

private function crop($user, $post){
    //get original image size
    $dimensions = getimagesize($post['image_src']);

    //get crop box dimensions
    $width = $post['w'] * ($dimensions[0] / $post['img_width']);
    $height = $post['h'] * ($dimensions[1] / $post['img_height']);

    //get crop box offset
    $y = $post['y'] * ($dimensions[1] / $post['img_height']);
    $x = $post['x'] * ($dimensions[0] / $post['img_width']);

    //create image 120x160
    $img = imagecreatetruecolor(120, 160); 
    $src = imagecreatefromjpeg($post['image_src']);

    imagecopyresampled($img, $src, 0, 0, $x, $y, 120, 160, $width, $height);

    //and save the image 
    return imagejpeg($img, 'uploads/avatars/'.$user->id.'/small/'.$post['image_name'].".jpg" , 100);
}
0 голосов
/ 19 февраля 2012

Когда вы говорите «изменение размера с помощью HTML», подразумеваете ли вы указание размера с помощью атрибутов width и height элемента img? Если это так, это не повлияет на размеры файла на сервере, и вы все равно можете получить их, используя getimagesize.

Примерно так будет возвращаться исходная ширина и высота изображения:

function get_source_size($the_file_path)
{
    $imagesize = getimagesize($the_file_path);
    return array('width' => $imagesize[0], 'height' => $imagesize[1]);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...