2011-01-07 4 views
1

У меня есть несколько изображений, которые являются sotred как данные BLOB в моей базе данных. Я знаю, что это не очень хорошая идея, но это то, что я использую.Изменение размера изображений - Symfony

У меня следующий код в моем классе Peer:

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. Это код, который я использую, который я изменил для работы с вашим блобом. Это также добавляет белый фон, если исходное соотношение ширины и высоты не совпадает с размером изображения назначения.

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 или другой библиотеки и сохранить ее во втором столбце blob.

В противном случае вы можете указать одно измерение в html, и изображение сохранит его размеры.

+0

Ну, у меня есть изображение размером 250x500, и когда я устанавливаю ширину до 150, изображение выглядит раздавленным и искаженным. Таким образом, я хотел бы создать миниатюру или отобразить изображение с правильным коэффициентом масштабирования. – terrid25

+0

@terrid Когда вы говорите, что изображение выглядит раздавленным и искаженным, что именно вы имеете в виду? Если у вас есть изображение 250x500, которое отображается в элементе img с шириной, установленной на 150, и без высоты, изображение должно отображаться на уровне 150x300, то есть на правильном соотношении сторон. Вы уверены, что элемент не наследует высоту где-то? –

Смежные вопросы