1

次の PHP スクリプトを使用して、ここで取得した正方形のサムネイルを作成していましたhttp://www.abeautifulsite.net/blog/2009/08/cropping-an-image-to-make-square-thumbnails-in-php/

これを画像アップロード スクリプトに統合することができました。このスクリプトは、フル サイズの画像をアップロードし、その後、アップロードされた画像を取得して、そこからサムネイルを作成します。問題は、スクリプトの作成者によると、横向きと縦向きの画像を問題なくトリミングすることです。横向きの画像は完全にトリミングされますが、縦向きの画像に面しているため、出力サムネイルはトリミングされませんが、指定された正方形のサムネイルの高さに合わせて縮小されて表示され、側面の空きスペースが黒色で塗りつぶされます。これを修正する方法があることは知っていますが、PHP に比較的慣れていないため、解決できません。

PHP の実際の経験を持つ人はこれを修正できますか? 前もって感謝します!

スクリプトはここにあります: $

 function square_crop($src_image, $dest_image, $thumb_size = 64, $jpg_quality = 90) {

// Get dimensions of existing image
$image = getimagesize($src_image);

// Check for valid dimensions
if( $image[0] <= 0 || $image[1] <= 0 ) return false;

// Determine format from MIME-Type
$image['format'] = strtolower(preg_replace('/^.*?\//', '', $image['mime']));

// Import image
switch( $image['format'] ) {
    case 'jpg':
    case 'jpeg':
        $image_data = imagecreatefromjpeg($src_image);
    break;
    case 'png':
        $image_data = imagecreatefrompng($src_image);
    break;
    case 'gif':
        $image_data = imagecreatefromgif($src_image);
    break;
    default:
        // Unsupported format
        return false;
    break;
}

// Verify import
if( $image_data == false ) return false;

// Calculate measurements
if( $image[0] & $image[1] ) {
    // For landscape images
    $x_offset = ($image[0] - $image[1]) / 2;
    $y_offset = 0;
    $square_size = $image[0] - ($x_offset * 2);
} else {
    // For portrait and square images
    $x_offset = 0;
    $y_offset = ($image[1] - $image[0]) / 2;
    $square_size = $image[1] - ($y_offset * 2);
}

// Resize and crop
$canvas = imagecreatetruecolor($thumb_size, $thumb_size);
if( imagecopyresampled(
    $canvas,
    $image_data,
    0,
    0,
    $x_offset,
    $y_offset,
    $thumb_size,
    $thumb_size,
    $square_size,
    $square_size
)) {

    // Create thumbnail
    switch( strtolower(preg_replace('/^.*\./', '', $dest_image)) ) {
        case 'jpg':
        case 'jpeg':
            return imagejpeg($canvas, $dest_image, $jpg_quality);
        break;
        case 'png':
            return imagepng($canvas, $dest_image);
        break;
        case 'gif':
            return imagegif($canvas, $dest_image);
        break;
        default:
            // Unsupported format
            return false;
        break;
    }

     } else {
    return false;
     }
    }
    ?>

そして、私はそれを次のように呼んでいます - square_crop('source_image', 'destination_image', 65);

ここで結果を見ることができますhttp://imageshack.us/photo/my-images/717/imgfl.png/

これは縦長の画像でのみ発生し、横長の画像は正方形全体を埋めるようにトリミングされます。

4

2 に答える 2

1

クロッピングのみの場合は、imagecopyresampled() 関数を imagecopy() に置き換えます。

ソースと宛先の座標と幅と高さが異なる場合、リサンプリングされた はイメージの適切なストレッチまたは縮小を実行します。imagecopy() はしません。

于 2012-04-11T14:22:09.773 に答える