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」という単語をファイル名に追加します。しかし、バージョン画像の幅と高さの記録(メイン画像のみ)を取得することはできません(本当に欲しいです)。だから、そのモデルは最高ではないかもしれません...または多分それは...

プロジェクトに取り掛かる前に質問しようと思いました。良い足元から始めて、しっかりした土台を作りたいです。

私は正しい道を進んでいますか?使用するのは 2 番目のモデルですか。私が知っておくべきより良いモデルはありますか?

前もって感謝します

4

4 に答える 4

2

私は間違いなく2番目に行きます。数を制限することなく、使用可能なサイズを柔軟に設定できます。

于 2012-04-16T05:04:01.193 に答える
1

2番目のモデルの方が優れています。

このモデルに加える可能性のある唯一の微調整は、filename属性をベース名とサフィックスに分離し、次の不要なIDを取り除くことです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 に答える
1

また、 1 つの画像を保存してから、ImageMagick のようなツールを使用してオンザフライでサイズを変更することも検討してください。

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

于 2012-04-16T05:07:20.513 に答える
0

getimagesize画像をアップロードしたら、次の関数を使用して画像のサイズを取得できます。

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

それが最も簡単で、必要なすべての柔軟性が得られると思います。

于 2012-04-16T05:28:29.160 に答える