3

私のアプリは、Web ブラウザーから base64 でエンコードされた画像ファイルを受信して​​います。それらをクライアントに保存する必要があります。だから私はした:

$data = base64_decode($base64img);
$fileName = uniqid() . '.jpg';
file_put_contents($uploadPath . $fileName, $data);
return $fileName;

これはうまくいきます。

ここで、画像を最大に圧縮してサイズを変更する必要があります。アスペクト比を維持しながら、幅と高さを 800 にします。

だから私は試しました:

$data = base64_decode($base64img);
$fileName = uniqid() . '.jpg';
file_put_contents($uploadPath . $fileName, $data);
return $fileName;

これは機能しません (エラー: 「imagejpeg() はパラメーター 1 がリソースであり、文字列が指定されていることを期待しています」)。そしてもちろん、これは圧縮しますが、サイズ変更はしません。

ファイルを /tmp に保存し、読み取り、GD 経由でサイズ変更/移動するのが最善でしょうか?

ありがとう。

第二部

@ontrackのおかげで、私は今それを知っています

$data = imagejpeg(imagecreatefromstring($data),$uploadPath . $fileName,80);

動作します。

しかし今、画像のサイズを幅と高さを最大 800 に変更する必要があります。私はこの機能を持っています:

function resizeAndCompressImagefunction($file, $w, $h, $crop=FALSE) {
    list($width, $height) = getimagesize($file);
    $r = $width / $height;
    if ($crop) {
        if ($width > $height) {
            $width = ceil($width-($width*($r-$w/$h)));
        } else {
            $height = ceil($height-($height*($r-$w/$h)));
        }
        $newwidth = $w;
        $newheight = $h;
    } else {
        if ($w/$h > $r) {
            $newwidth = $h*$r;
            $newheight = $h;
        } else {
            $newheight = $w/$r;
            $newwidth = $w;
        }
    }
    $src = imagecreatefromjpeg($file);
    $dst = imagecreatetruecolor($newwidth, $newheight);
    imagecopyresampled($dst, $src, 0, 0, 0, 0, $newwidth, $newheight, $width, $height);
    return $dst;
}

だから私はできると思った:

$data = imagejpeg(resizeAndCompressImagefunction(imagecreatefromstring($data),800,800),$uploadPath . $fileName,80);

これは機能しません。

4

1 に答える 1

3

imagecreatefromstringを使用できます


2番目の部分に答えるには:

$data = imagejpeg(resizeAndCompressImagefunction(imagecreatefromstring($data),800,800),$uploadPath . $fileName,80);

$data には、 imagejpegの操作が成功したかどうかを示す true または false のみが含まれます。バイトは にあり$uploadPath . $fileNameます。実際のバイトを戻したい場合は$data、一時出力バッファーを使用する必要があります。

$img = imagecreatefromstring($data);
$img = resizeAndCompressImagefunction($img, 800, 800);
ob_start();
imagejpeg($img, null, 80);
$data = ob_get_clean(); 
于 2013-06-22T21:42:10.130 に答える