2

ユーザーが画像をアップロードし、その画像を「元のコピー」としてディレクトリに保存できるようにしようとしています

public_html/data/user_images/yyyy/MM/dd/guid.ext 

次に、GD を使用して、イメージの複数のコピーをさまざまなサイズで作成し、ファイル システム内の別の動的な場所に保存します。

public_html/data/user_images/width/yyyy/MM/dd/guid.ext  

GD ライブラリを使用して操作された画像を保存する前に、ファイルが既に存在している必要があると思わせる次のエラーに遭遇し続けます。

imagejpeg(/data/user_images/200/2013/05/21/9714624e10eed645e822babd0acccf69ac421d59.png): 

failed to open stream: No such file or directory

相対パスと絶対パスの両方で同じエラーが発生します。このディレクトリまたはファイルが存在しないことはわかっています。アップロードされた画像の元のコピーを保存すると、コードは期待どおりに機能しますが、動的ディレクトリに新しい画像を作成することはできません。

以下は私の画像ヘルパーのコードです。パラメータとして、元の保存された画像の場所、サイズの配列、および新しい画像のファイル名を取ります。createDirectories 関数は、動的に作成された絶対パスと相対パスを含む配列を返します。

public static function create_sizes($image, $sizes, $filename){

    $current_size = GetimageSize($image);
    $urls = array();

    switch(strtolower($current_size['mime'])){
        case 'image/png':
            $image_original = imagecreatefrompng($image);
            break;
        case 'image/jpeg':
            $image_original = imagecreatefromjpeg($image);
            break;
        case 'image/gif':
            $image_original = imagecreatefromgif($image);
            break;
        default: die();
    }



    foreach($sizes as $width){

        $directories = self::createDirectories('user_images/'.$width);

        $aspect_ratio = $current_size[0] / $current_size[1];
        $height = (int) ($width / $aspect_ratio);

        $photoX = ImagesX($image_original);
        $photoY = ImagesY($image_original);

        $image_new = ImageCreateTrueColor($width, $height);

        ImageCopyResampled($image_new, $image_original, 0, 0, 0, 0, $width+1, $height+1, $photoX, $photoY);

        ImageJPEG($image_new, $directories['absolute'].$filename, 100);
        array_push($urls, $directories['relative'].$filename);
    }

    ImageDestroy($image_original);
    ImageDestroy($image_new);

    return $urls;
}
4

1 に答える 1

3

ImageProcessor クラスを簡単に見てみましょう。役立つと思います: http://pastebin.com/zNY02N57

使用法: ユーザーがファイルをアップロードするとき、その名前は $_FILES['input_name']['tmp_name'] にあります。まず、クラスの空のインスタンスを作成します。

$OriginalImage = new ImageProcessor();
//Note that it will automatically detect the file type :)
if(!$OriginalImage->Load($_FILES['input_name']['tmp_name']))
    die('Image is invalid');

次に、サイズ変更の方法を選択する必要があります。画像の幅または高さを固定するか、選択した正確なサイズにすることができますが、収まらない場合は黒い背景になります。

Fixed width:
$NewImage = $OriginalImage->ResizeWPreserve($NewWidth)
Fixed height:
$NewImage = $OriginalImage->ResizeHPreserve($NewHeight)
Fixed size:
$NewImage = $OriginalImage->ResizeCanvas($NewWidth, $NewHeight)

Then, to save it, simply:
$NewImage->Save('FileName.jpg');

次のようなループで保存とサイズ変更を繰り返すことができます。

$Sizes = array(640, 800, 1024);
foreach($Sizes as $Width)
{
    $OriginalImage->ResizeWPreserve($Width)->Save(sprintf('Images/%s/%d.jpg', 'SomeName', $Width));
}

クラス

于 2013-05-21T08:43:10.217 に答える