LogoMark.png

堀玲二/情報デザイン研究II

MEMORIES COLLECTION

テンプレートを使った映画の思い出オリジナルカードを作成できるサイト

情報デザイン研究三年後期.png

概要

これは何?

映画鑑賞の思い出を記録し、コレクションできるオリジナルカード作成サイト

背景と目的

映画を観に行ったときにもらうチケットは、多くの場合映画鑑賞後に捨てられてしまう。思い出は次第に風化され、チケットが捨てられれば記憶を思い出すきっかけを失うことになる。本研究ではwebサイトを用いて映画鑑賞という思い出をテンプレートやユーザーが自ら選択した写真を使い思い出オリジナルカードを作成する。この方法で思い出を形に残し、「コレクション」として楽しめるようにすることで、記憶を呼び起こすきっかけを作り、感動をいつまでも忘れないようにする。


コンセプト


成果物の仕様


制作ツール

Adobe Illustrator
VScode
Procreate
figma

プロジェクトの期間

4月29日〜1月10日(通年)

まとめ

中間まとめ

全体まとめ




調査

現状調査

人生で一番大切な仕事は「思い出づくり」
DIE WITH ZERO 人生が豊かになりすぎる究極のルール

映画を観た後、チケットの半券を捨てている人の割合は53.9%
映画の半券を捨てるか捨てないかのアンケート記事

映画のチケットを窓口で購入している人の割合は 63.5%
実践『ペルソナ』通信 (No.47)映画の半券の保存状況に関する調査結果

先行事例

ピンタレストのボード
思い出きっぷ

技法・技術情報

デザインの心理学



プロジェクト管理

スケジュール

情報デザイン研究ガントチャート

ToDo

チケットのデザイン案を計4案考える
デザイン案をもとにチケット作成
ジャンル別に使う色を考える
サイトマップを考える
ワイヤーフレームを考える
サイトで使用する機能のリスト化
%%サイト内原稿の作成%%
サイトで使用する機能簡易作成
%%チケットデザイン案ブラッシュアップ%%
%%コーディング%%





進捗記録




2025.12.08



発表のフィードバック




2025.12.01


発表用完成画像

original-example.jpg
exampleImg.jpg






ユーザーが好きな画像をアップロードし
その画像をキャンバス内に表示させる機能
javascriptコード例

const canvas = document.querySelector("#myCanvas");
const ctx = canvas.getContext("2d");
const imageUpload = document.querySelector('#imageUpload');
let userImage = null;

const img = new Image();

imageUpload.addEventListener('change', (e) => {

   const file = e.target.files[0];
   if (!file) return;
   const reader = new FileReader();
   reader.onload = () => {

       img.src = reader.result;

       img.onload = () => {
           drawCanvas(textInput6.value || '作品タイトル',textInput7.value || '自由記述(40字以内)'); // ← 画像ロード完了後に描画
       };
   };
   reader.readAsDataURL(file);
});
textInput6.addEventListener('input', () => {
   drawCanvas(textInput6.value || '作品タイトル',textInput7.value || '自由記述(40字        以内)');
});
textInput7.addEventListener('input', () => {
   drawCanvas(textInput6.value || '作品タイトル',textInput7.value || '自由記述(40字 以内)');
});


type="file"を指定するとユーザーがファイルを指定できるようになる。

つまり画像ファイル(JPEG / PNG / GIF / WebP / SVG など)だけを選択対象にする。

使い方

コード例

const reader = new FileReader();

reader.onload = () => {
 img.src = reader.result;
};

reader.readAsDataURL(file);

①const reader = new FileReader();

②reader.onload = () => {

img.src = reader.result;

};
reader.result は、**FileReader がファイルの読み取りを終えたときに格納する「読み取り結果」**を保持するプロパティです。
読み方(readAsDataURL / readAsText / readAsArrayBuffer)によって中身の型や形式が変わります。

③reader.readAsDataURL(file);

toDataURL()との違い


キャンバス内に画像表示をする際の画像中央での自動切り取り機能
コード例

const drawCanvas = () => {

   const canvasW = canvas.width;
   const canvasH = canvas.height;
   const imgW = img.width;
   const imgH = img.height;


   // canvasを覆うための拡大率(cover)
   const scale = Math.max(canvasW / imgW, canvasH / imgH);
   const drawW = imgW * scale;
   const drawH = imgH * scale;


   // 中央配置
   const dx = (canvasW - drawW) / 2;
   const dy = (canvasH - drawH) / 2;
   ctx.clearRect(0, 0, canvasW, canvasH);
   ctx.drawImage(img, dx, dy, drawW, drawH);
   ctx.fillStyle = `rgba(0, 0, 0, 0.4)`;
   ctx.fillRect(0, 0, canvas.width, canvas.height)}

解説

const scale = Math.max(canvasW / imgW, canvasH / imgH);

ここでやっていること




const drawW = imgW * scale;
const drawH = imgH * scale;

何をしているか




const dx = (canvasW - drawW) / 2;
const dy = (canvasH - drawH) / 2;

何をしているか

ctx.drawImage(img, dx, dy, drawW, drawH);

におけるdx、dyは画像を描き始める X座標とY座標
(canvasW - drawW)と(canvasH - drawH)ではみ出した分を割る2で均等にはみ出して画像を配置する。

実際に画像を切り取っているのではなくCanvas の「キャンバス外に描かれたものは表示されない」という特性を利用して、画像を左右・上下に均等にはみ出す位置に配置している。




2025.11.24



キャンバス内の文章自動改行機能
インプット知識




自動改行機能解説

① textInput7.addEventListener('input', () => { drawCanvas(textInput6.value || '作品タイトル',textInput7.value || '自由記述(300字以内)'); });
HTMLのテキストエリアにて入力した内容を取得しイベントを発生させる。テキストに記入された内容があればその内容をなければ「自由記述(300字以内」を文字列として渡す。この時NULLとして扱われずに、文字列として扱われる。
② const maxCharsPerLine = 30;
   const drawCanvas = (title,free) => {
     const freeLines = wrapTextByChars(free || '', maxCharsPerLine); }
drawCanvas内にて関数wrapTextByCharsを呼び出す。この関数は自動改行機能の要となる関数。引数のfreeにはHTMLのテキストエリアにて入力した内容または代用文字列が渡される。
③const wrapTextByChars = (text, maxChars = 30) => { const lines = []; const rawLines = String(text).split('\n'); rawLines.forEach(line => { for (let i = 0; i < line.length; i += maxChars) { lines.push(line.slice(i, i + maxChars)); } if (line.length === 0) lines.push(''); }); return lines; }
引数textには引数のfreeにはHTMLのテキストエリアにて入力した内容または代用文字列が入る。maxChars = 30はデフォルト引数。
const lines = [];で空の配列を用意。
const rawLines = String(text).split('\n');
stringは渡された値をそのまま文字列にする。渡されたものが文字数以外の時にエラーを防ぐ役割がある。split(‘\n’);は指定した文字列の中に()内で指定した文字があればその位置で文字列を分割し配列に格納する機能を持つが今回の場合は指定した文字がないので、全体をそのまま意要素の配列として格納する。
rawLines.forEach(line => { for (let i = 0; i < line.length; i += maxChars) { lines.push(line.slice(i, i + maxChars)); }
でsplit()で出来た配列から要素を分割して取り出し、push()で指定した配列の末尾に要素を追加する。今回はあらかじめ用意していた空配列に入れる。for文の条件チェックでは分割された残りの文字列の長さは見ていない。見ているのは元のline.lengthの長さ。
④return lines;で配列の値を返す。
⑤drawCanvas内にて戻り値の配列を一つずつ取り出して、座標をずらしてfillTextでキャンバス内に描画。
終了




2025.11.17



コーディング作業を進めました。

toppage.jpg




2025.10.27



技術

function(p) {
return p.price <= 2000;
}

pには配列の各要素が代入される。

2025.10.20



コーディング作業

2025.10.13


発表フィードバック

2025.10.06



発表準備





2025.09.29


機能お試し作成

サイトで使用する機能のリスト化

Webサイトアニメーション理由

この記事では便宜的に、サイトを閲覧しているユーザーを「閲覧者」、サイトで情報を発信・運用している管理者を「発信者」とします。

 参考サイト

インプット技術

JavaScriptと合わせて使用するhtmlタグ

2025.09.22


機能お試し作成

2025.09.15


サイトで使用する機能のリスト化

いきなりサイトを作り始めるのではなく機能のみの作成から始める。
入力した文字を画像上に出力が時間がかかる見込みなので、それ以外
の機能から作成を開始する。

研究進行について




PAGES

GUIDE

添付ファイル: fileoriginal-example.jpg 14件 [詳細] fileexampleImg.jpg 12件 [詳細] filetoppage.jpg 16件 [詳細] file情報デザイン研究三年後期.png 35件 [詳細]
Last-modified: 2026-01-30 (金) 14:16:48