0

我正在做一个主要关注照片的项目。我想上传同一张图片的 4 个不同版本。

由于项目的性质,图像需要是最佳的,因此以最佳质量(最佳质量/尺寸比)上传。我将使用 Photoshop 创建 4 张图像的最佳质量/尺寸版本。换句话说,我不会在上传时使用 PHP 来调整图像大小。

对于所有 4 张图片,标题描述与上传图片的日期相同。每个图像都会有自己的宽度高度属性(以便在以 html 格式输出图像时帮助浏览器)...

我想出了以下模型:

image (image_id, title, desc, filename_s, filename_s_width, filename_s_height, filename_m, filename_m_width, filename_m_height, filename_l, filename_l_width, filename_l_height, filename_xl, filename_xl_width, filename_xl_height, uploaded)

然后,考虑到上述模型将来不会有很大的扩展性,我想到了以下模型:

image (image_id, title, desc, uploaded)
imagesize (size_id, size)
image_version (id, image_id, filename, width, height, size_id)

还有3个模型,包括上传主图像并在数据库中记录。对于该主图像的版本,将单词“_small”、“_medium”、“_large”、“_xlarge”附加到文件名。但是,我将无法记录版本图像的宽度和高度(只是主要图像)(我真的想要)。所以,也许那个模型不是最好的……或者它是……

我想在我开始这个项目之前我会问。我想从一个好的开始,并有一个坚实的基础。

我在正确的道路上吗?您会使用第二种型号吗?有没有更好的模型我应该知道?

提前致谢

4

4 回答 4

2

我肯定会选择第二个。它允许在不限制数量的情况下提供可用尺寸的灵活性。

于 2012-04-16T05:04:01.193 回答
1

请也考虑存储一张图像,然后使用 ImageMagick 等工具即时调整其大小:

http://php.net/manual/en/book.imagick.php

于 2012-04-16T05:07:20.513 回答
1

你的第二个模型更好。

我可能对这个模型做的唯一调整是将filename属性分成基本名称和后缀,并去掉不必要的 id on image_version

CREATE TABLE imagesizes (
    id TINYINT UNSIGNED NOT NULL PRIMARY KEY,
    size VARCHAR NOT NULL COMMENT 'e.g. small, large, thumbnail, original, etc',
    suffix VARCHAR NOT NULL COMMENT 'e.g. _s, _l, _t, or nothing for no suffix',
    UNIQUE KEY suffix (suffix),
    UNIQUE KEY size (size)
);

CREATE TABLE images (
    id INTEGER UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
    basename VARCHAR NOT NULL COMMENT 'the base name of the image. Add suffixes to get a filename',
    title VARCHAR NOT NULL,
    desc VARCHAR NOT NULL,
    uploaded_on DATETIME NOT NULL,
    UNIQUE KEY basename (basename)
);

CREATE TABLE imagefiles (
    image_id INTEGER UNSIGNED NOT NULL,
    imagesize_id TINYINT UNSIGNED NOT NULL,
    width INTEGER UNSIGNED NOT NULL,
    height INTEGER UNSIGNED NOT NULL,
    PRIMARY KEY (image_id, imagesize_id),
    KEY imagesize_idx (imagesize_id),
    CONSTRAINT image FOREIGN KEY (image_id) REFERENCES images (id) ON DELETE CASCADE ON UPDATE CASCADE,
    CONSTRAINT imagesize FOREIGN KEY (imagesize_id) REFERENCES imagesizes (id) ON DELETE NO ACTION ON UPDATE CASCADE
);

然后,您可以像这样获得文件名:

SELECT CONCAT(image.basename, imagesizes.suffix) AS filename
FROM images INNER JOIN imagefiles ON images.id=imagefiles.id
INNER JOIN imagesizes ON imagefiles.imagesize_id=imagesizes.id;

对于普通情况,您可能应该将其包装在视图中并改为查询视图:

CREATE VIEW imagelist AS 
SELECT images.id AS id, images.basename AS basename, images.title AS title, images.desc AS desc, 
images.uploaded_on AS uploaded_on, imagefiles.width AS width, imagefiles.height AS height, imagesizes.id AS size_id, 
imagesizes.size AS size, imagesizes.suffix AS suffix, 
CONCAT(imagefiles.basename, imagesizes.suffix) AS filename;
于 2012-04-16T07:13:07.207 回答
0

上传图片后,您可以使用以下getimagesize函数获取图片尺寸:

http://php.net/manual/en/function.getimagesize.php

猜猜这将是最简单的,并为您提供所需的所有灵活性。

于 2012-04-16T05:28:29.160 回答