Я работаю над сайтом, который продает различные произведения искусства, как лучше всего обрабатывать изображения разных размеров? - PullRequest
3 голосов
/ 17 мая 2010

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

  • Как определять категории разных размеров (маленькие, средние, большие) таким образом, чтобы я мог динамически изменять размеры изображений с пропорциональными размерами.

  • Должен ли я хранить актуальные JPEG разных размеров для скачивания? Или было бы проще генерировать эти разные размеры для загрузки на лету

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

Все мнения, советы приветствуются!

Ответы [ 2 ]

2 голосов
/ 17 мая 2010

Я делаю что-то подобное с aarongriffin.co.uk .

Там некоторые изображения изменяются на лету при первом запросе, а затем сохраняются; в то время как другие генерируются во время загрузки. Изображения, которые, как правило, запрашиваются в группах (то есть эскизы), генерируются во время загрузки, а изображения, которые имеют тенденцию отображаться по одному, создаются на лету. Это хорошо сработало для меня, но это сайт без слишком большого трафика.

Я работаю в Python и Django, поэтому для этого я использую sorl-thumbnail. В PHP у вас есть доступ к различным функциям imagecreate *, которые выполняют (вроде) одно и то же.

Я создаю версии фотографий с водяными знаками (если на конкретный альбом следует добавлять водяные знаки) и сохраняю их вместо копий без водяных знаков.

1 голос
/ 17 мая 2010

Вы можете проверить пиктограммы php для этого. Вот фрагмент кода, который может быть полезен.

<?php
# Constants
define(IMAGE_BASE, '/var/www/html/mbailey/images');
define(MAX_WIDTH, 150);
define(MAX_HEIGHT, 150);

# Get image location
$image_file = str_replace('..', '', $_SERVER['QUERY_STRING']);
$image_path = IMAGE_BASE . "/$image_file";

# Load image
$img = null;
$ext = strtolower(end(explode('.', $image_path)));
if ($ext == 'jpg' || $ext == 'jpeg') {
    $img = @imagecreatefromjpeg($image_path);
} else if ($ext == 'png') {
    $img = @imagecreatefrompng($image_path);
# Only if your version of GD includes GIF support
} else if ($ext == 'gif') {
    $img = @imagecreatefrompng($image_path);
}

# If an image was successfully loaded, test the image for size
if ($img) {

    # Get image size and scale ratio
    $width = imagesx($img);
    $height = imagesy($img);
    $scale = min(MAX_WIDTH/$width, MAX_HEIGHT/$height);

    # If the image is larger than the max shrink it
    if ($scale &lt; 1) {
        $new_width = floor($scale*$width);
        $new_height = floor($scale*$height);

        # Create a new temporary image
        $tmp_img = imagecreatetruecolor($new_width, $new_height);

        # Copy and resize old image into new image
        imagecopyresized($tmp_img, $img, 0, 0, 0, 0,
                         $new_width, $new_height, $width, $height);
        imagedestroy($img);
        $img = $tmp_img;
    }
}

# Create error image if necessary
if (!$img) {
    $img = imagecreate(MAX_WIDTH, MAX_HEIGHT);
    imagecolorallocate($img,0,0,0);
    $c = imagecolorallocate($img,70,70,70);
    imageline($img,0,0,MAX_WIDTH,MAX_HEIGHT,$c2);
    imageline($img,MAX_WIDTH,0,0,MAX_HEIGHT,$c2);
}

# Display the image
header("Content-type: image/jpeg");
imagejpeg($img);
?>
...