2

これが私の現在のコードです:

$image  = 'img.jpg';
$source = imagecreatefromjpeg($image);

list($origWidth, $origHeight) = getimagesize($image);

$imgH   = 75;
$imgW   = $origWidth / $origHeight * $imgH;
$thumb  = imagecreatetruecolor($imgW, $imgH);

imagecopyresampled($thumb, $source, 0, 0, 0, 0, $imgW, $imgH, $origWidth, $origHeight);

これにより、高さが 75 ピクセルに固定された画像を出力できます。私がやりたいのは、一定の画像サイズの99x75ピクセルを持つことです。これに収まらない縦向きの画像は、中央から切り取られます (そのため、元の画像の中央がサムネイルの中央のままになります - それが理にかなっている場合)。

これどうやってするの?

4

3 に答える 3

2

まあ、それは純粋な数学です。99x75 のサイズを実現したいと考えており、幅からのみカットしたいと考えています。まず、高さに合わせてサイズを変更します。それはあなたがしたことですが、75 の高さに合うようにしました。それを 99 に切り替えます。次に、幅が <= 75 であることを確認します。そうでない場合は、次のようにします。

if( $imgW > 75 )
{
   $diff   = $imgw - 75; // this is what's extra
   $srcX   = ceil( $diff / 2 ); // this is where your img starts from
   $imgW   = 75;
}
imagecopyresampled($thumb, $source, 0, 0, $srcX, 0, $imgW, $imgH, $origWidth, $origHeight); // notice that src X changed accordingly.

したがって、最初の「サイズ変更」後の幅が 100 で、75 が必要な場合は、diff = 25 を計算し、それを 2 で分割して ceil => 13 にし、GD 関数に 13 から画像のコピーを開始するように指示します。 0 の代わりに 75 の高さを維持します。これは、幅 13 から幅 88 => 中央にコピーされることを意味します。

これがあなたが望んでいたものであることを願っています。よろしく、ガブリエル

于 2010-05-21T06:06:36.293 に答える
1
define( 'THUMB_WIDTH',  99 );
define( 'THUMB_HEIGHT', 75 );

$image = imagecreatefromjpeg('img.jpg');
$thumb = imagecreatetruecolor(THUMB_WIDTH, THUMB_HEIGHT);

list($image_width, $image_height) = getimagesize($image);
$x0 = ( $image_width  - THUMB_WIDTH  ) / 2;
$y0 = ( $image_height - THUMB_HEIGHT ) / 2;
imagecopy(
    $thumb,      // resource $dst_im
    $image,      // resource $src_im
    0,           // int $dst_x
    0,           // int $dst_y
    $x0,         // int $src_x
    $y0,         // int $src_y
    THUMB_WIDTH, // int $src_w
    THUMB_HEIGHT // int $src_h  
);

このコードは、imagecopy関数を使用して、ソース イメージから 99x75px の領域をコピーします。ソースの幅 - 99 / 2 はコピーを開始する x 座標を返し、ソースの高さ - 75 / 2 は y 座標を返します。任意のサイズの画像から固定サイズのサムネイルを生成することに興味がある場合は、この記事をご覧ください。

于 2010-05-24T09:22:20.187 に答える
0

(未テスト)

define('THUMB_WIDTH', 99);
define('THUMB_HEIGHT', 75);

$image  = 'img.jpg';
$source = imagecreatefromjpeg($image);
$thumb  = imagecreatetruecolor(THUMB_WIDTH, THUMB_HEIGHT);

$cutX = imagesx($source) > THUMB_WIDTH;
$cutY = imagesy($source) > THUMB_HEIGHT;

$source_x = $cutX ? imagesx($source) / 2 - (THUMB_WIDTH/2) : 0;
$source_y = $cutY ? imagesx($source) / 2 - (THUMB_HEIGHT/2) : 0;
$source_width = $cutX ? THUMB_WIDTH : imagesx($source);
$source_height = $cutY ? THUMB_HEIGHT : imagesy($source);

imagecopyresampled($thumb, $source, 0, 0, $source_x, $source_y, $source_width, $source_height, THUMB_WIDTH, THUMB_HEIGHT);
于 2010-05-21T06:07:25.013 に答える