ограничение размера изображения, извлекаемого из таблицы SQL

#php #mysql #html #image

#php #mysql #HTML #изображение

Вопрос:

Я создаю систему вращающихся баннеров, но существует проблема с отображением несоответствующего размера изображения. Я сохраняю изображения в таблице SQL. Я знаю, что это плохая практика хранить изображения в таблицах SQL, но я сохраняю только несколько файлов. Мне нужно исправить размер отображения изображения, скажем, 150 на 150 пикселей. Как мне это сделать с помощью php? Заранее спасибо

Вот код, который у меня есть на данный момент:

 <?php
require ("connect.php");

$id = mysql_real_escape_string($_REQUEST['id']);
$query = mysql_query("SELECT * FROM banner WHERE id= $id ");
$row = mysql_fetch_array($query);
$content = $row['image'];
header('Content-type: image/jpg');
echo $content;
?>

<html>
    <head>
        <style type="text/css">
            a
            {
                text-decoration:none;
            }
        </style>
    </head>
    <body>

    <?php
require ("connect.php");

$query = mysql_query("SELECT * FROM banner");
$number = mysql_num_rows($query);
$result = mysql_query("SELECT * FROM banner ORDER BY RAND() LIMIT 1 ");

while ($row = mysql_fetch_assoc($result))
{
    echo '<a href = ' . $row[url] . '> <img src= "get.php?id= ' . $row[id] . ' "/> </a>';
    echo "<br />";
    echo '<a href = ' . $row[url] . '> ' . $row[description] . ' </a>';
}

echo mysql_error();
?>

    </body>
</html>
  

Комментарии:

1. Это просто, просто добавьте атрибуты width и height к вашему img элементу.

Ответ №1:

Что ж, если у вас есть контроль над изображениями, и они должны иметь размер всего 150×150 пикселей, я бы рекомендовал вам просто изменить их размер вручную и загрузить их обратно в вашу базу данных.

То, как вам придется это делать сейчас, означает, что вы будете изменять размер изображений на лету при каждой загрузке страницы, что плохо. Чтобы заставить это работать, все, что вам нужно сделать, это передать параметры ширины и высоты тегу img следующим образом

<img src="yourimage" width="150" height="150" />

Комментарии:

1. Как правило, вы хотите добавить ширину или высоту, а не оба. Оба приведут к нарушению соотношения сторон. Кроме того, я явно не согласен с вашим мнением о том, что нужно каждый раз изменять размер изображений. Это просто глупо.

2. @John Green — PageSpike Я сказал, что то, как он хочет сделать это сейчас, глупо. В идеале он должен использовать скрипт, подобный опубликованному вами, или аналогичный, чтобы загружать и изменять размер изображений один раз, следя за сохранением соотношения сторон. Каждый раз, когда он загружает страницу и извлекает изображение из базы данных, если оно не 150×150 пикселей, его размер придется изменять.

3. Именно поэтому вы его кэшируете. Мой скрипт предназначен для работы практически в режиме реального времени. Я использую аналогичный скрипт в качестве масштабируемого средства общего назначения по требованию.. единственное, что вы хотите убедиться, что вы кэшируете изображения, чтобы оно выполняло работу только в первый раз.

4. @John Green — PageSpike, с которым я согласен. Похоже, здесь мы отстаиваем одну и ту же точку зрения. В идеальном мире OP решал бы проблему с загрузкой -> изменить размер один раз (когда-либо) -> отобразить, а не с ситуацией, в которую он непреднамеренно попал, в которой является изменение размера -> кэш -> отображение, что означает, что время от времени, когда кэш очищается, ему придется снова изменять размер изображений

5. Это круто… не пытаюсь затевать драку. Однако я не согласен с вашим потоком. В большинстве случаев лучше всего загрузить -> сохранить. Оттуда вы ждете, пока кто-нибудь действительно захочет получить заданный размер, затем извлекаете из кэша или генерируете. Несколько лет назад я разработал социальную сеть… Я думаю, у нас было 16 разных размеров изображения. Обычно не было никаких причин для немедленного предварительного вычисления всех 16 размеров или их сохранения. Вместо этого мы просто создали серверы по требованию нужного размера. Таким образом, вы также сможете добавлять / изменять размеры в будущем. Я ожидаю, что большинство крупных серверов изображений используют аналогичные системы в этом отношении.

Ответ №2:

Вы можете масштабировать свое изображение, используя вызов внешней библиотеки gd.

Хотя я никогда не использовал его, есть то, что называется imagecreatefromstring(); (я бы использовал остальную часть этого кода, кстати…. Я бы просто никогда не стал хранить изображение в БД).

 $size = 150;
// This is a reference to your MySQL row.
$img = imagecreatefromstring($row['image_data']);
$width = imagesx($img);
$height = imagesy($img);

$aspect = $height/$width;

// This is a simple width check limiter.  There are dozens of ways to treat this,
// so code away until you get what you want.  Personally, I have a 3K line class to handle
// all of the different ways I may want to change this scaling around.
if ($width < $size) 
{
   $w = $width;
   $h = $height;
}
else 
{
   $w = $size;
   $h = floor($w*aspect);
}

$buffer = imagecreatetruecolor($w,$h);

// There are some more advanced ways of doing this if you need an alpha channel.
imagecopyresized($buffer,$img,0,0,0,0,$w,$h,$width,$height);

// File is now copied and ready to go.  You should save your file with a unique, but 
// reconstructable name.  For instance, if your parameters to get here was 
// 'image.php?image_id=25', I'd actually md5('image.php?image_id=25') and cache it.  In the
// future, you could check your cache to see if the image was there before you even make your
// DB call, which would speed things up greatly.

// I show an example in the code.

//    $filename = '/var/www/public/'.md5('image.php?'.$_SERVER['query_string'].'_'.$size);
$filename = 'test.jpg';
imagejpeg($buffer, $filename, 85 );

header('Content-Type: image/jpeg');
echo file_get_contents($filename);

imagedestroy($buffer);
imagedestroy($img);