2011-01-07 16 views
1

データベースにBLOBデータとして取り込まれた画像がいくつかあります。 これは良い考えではありませんが、私が使用していることです。イメージのサイズ変更 - Symfony

私は私のピアクラスのコードを次ています

public function getImagesPath() 
{ 
    $file_srcs = false; 
    $fp = $this->getPhoto->getBlobData(); 

    if ($fp !== null) 
    { 
     $file = stream_get_contents($fp); 
     $file_srcs = '/uploads/gallery/'.$this->getId().'.jpg'; 

    } 
return $file_srcs; 

}

私はそのようにように、私のテンプレートでこれを呼び出す:

  $path = $item->getImagesPath(); 
      if ($path) 
      { 
       echo '<img src="'.$path.'" alt="Thumbnail for '.$photo->getName().'" width="153" height="153" />'; 
      } 

さて、これはうまく動作しますが、、私は、正方形か長方形のいずれかの画像をいくつか持っています。 img srcでサイズ/幅を指定すると、その一部が歪んでしまいます。

イメージが表示される前にサイズを変更したりトリミングしたりできますか?

おかげ

答えて

1

imagecreatefromstringとimagecopyresampledを使用できます。これは私が使っているコードで、あなたのBLOBで動作するように変更しました。また、元のサイズの幅/高さの比率が宛先イメージのサイズと一致しない場合は、白い背景が追加されます。

static function CreateThumbnailFromBlob($blobData, $dstWidth = 100.0, $dstHeight = 100.0){ 
    $oldImg = @imagecreatefromstring($olduri); 
    if($oldImg){ 
     $realOldW = imagesx($oldImg); 
     $realOldH = imagesy($oldImg); 
     $destX = 0; 
     $destY = 0; 

     if($realOldH>=$realOldW && $realOldH>0){ 
      $realY = $dstHeight; 
      $realX = round($realY*$realOldW/$realOldH); 
      $destX = round($dstWidth/2-$realX/2); 
     }else{ 
      $realX = $dstWidth; 
      if($realOldW>0) 
       $realY = round($realX*$realOldH/$realOldW); 
      else 
       $realY = $dstHeight; 
      $destY = round($dstHeight/2-$realY/2); 
     } 
     $newImg = @imagecreatetruecolor($dstWidth, $dstHeight); 
     $white = imagecolorallocate($newImg, 255, 255, 255); 
     imagefill($newImg, 1, 1, $white); 
     imagecopyresampled($newImg,$oldImg,$destX,$destY, 
          0,0,$realX,$realY,$realOldW,$realOldH); 
     imagedestroy($oldImg); 
     return $newImg; 
    } 
} 
+0

明らかに、この関数はイメージクラスの一部であり、GDが必要です。 – Aspelund

3

sfThumbnailPluginは、私はプロジェクトの数に使用されてきたものであり、それはすごいです。 symfony 1.0の古いバージョンがあります。デフォルトではGDを使用していますが、ImageMagickを使用して、かなりクールなことをすることができます。

+0

しかし、このサポートはオンザフライで作成していますか?私はサーバー上のサムネイルとして画像を保存したくない。 – terrid25

+0

うーん..画像ファイルの出力ファイルが必要なのは90%ですが、tmpディレクトリに書き込んだら後で取り除くのはどうですか? – sjobe

+0

可能であれば、ファイルシステムのどこにでも表示しないようにしています。私はjsThumbPluginを見ましたが、これは1.0でしか動作しません。1.4(Propel)を使用しています – terrid25

1

どのように画像をデータベースに追加していますか?

アップロードフォームを使用している場合は、GDまたは別のライブラリを使用して適切なサイズ/ディメンションのサムネイルを作成し、2番目のBLOB列に保存することをおすすめします。

それ以外の場合は、htmlに1つのディメンションを指定することができ、画像はその寸法を保持します。

+0

私は250x500の画像を持っています。幅を150に設定すると、画像が歪んで歪んで見えます。したがって、サムネイルを作成するか、正しい縮尺比率で画像をレンダリングしたいと考えています – terrid25

+0

@terrid画像が潰れて歪んだと言うと、正確にはどういう意味ですか?幅が150、高さが設定されていないimg要素に250x500の画像が表示されている場合、画像は150x300、つまり正しいアスペクト比で表示されます。要素がどこかの高さを継承していないと確信していますか? –

関連する問題